为什么这种javascript继承会导致引用共享数组
Why does this javascript inheritance cause references to share array?
我有一个基类
function Base(){
this.children = new Array();
}
Base.prototype.Add = function(child){
this.children.push(child)
}
function Sub1(){...}
Sub1.prototype = new Base();
function Sub2(){...}
Sub2.prototype = new Base();
为什么我做
var S1_1 = new Sub1();
var S1_2 = new Sub1();
S1_1.Add(new Sub2());
由于某种原因,S1_2也有1个子项,并且包含与添加到S1_1的子项i相同的信息?
这是因为原型继承就是这样工作的。所有Sub1
对象都继承自一个公共Base
对象。因为Base
对象包含Array,所以所有Sub1
实例都共享该Array。
换句话说,当你要求每个Sub1
对象的.children
属性时,他们会发现他们不拥有这样的属性,因此会在他们继承的原型上寻找它。由于它们继承自相同的原型对象,因此使用相同的Array。
对于每个Sub1
都有自己的Array,您应该在Sub1
构造函数中定义它。
function Base(){
this.children = new Array();
}
Base.prototype.Add = function(child){
this.children.push(child); // `this` will be whatever object invoked the method
}
function Sub1(){
this.children = [];
}
Sub1.prototype = new Base();
function Sub2(){
this.children = [];
}
Sub2.prototype = new Base();
创建子时,您没有获得ownership
/用this
定义的基本变量的副本,您可以使用:
function Sub1(){
Base.call(this);
}
该代码使用Sub1实例作为this
上下文来调用Base。
关于原型行为的更多信息可以在这里找到:原型继承-编写
相关文章:
- 引用对象中的通用值
- 如何在JavaScript中将字符串转换为函数引用
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 在动态创建的元素上获取对特定选择器的引用
- IIFE中的函数引用不可用
- 如何通过引用var Using DataTables来进行分页或排序
- 如何在创建键时引用来自同一对象的键
- Facebook共享显示一个接一个的空白页面
- Datatables:通过DOM数据源中的名称引用列
- 自引用回调
- 引用类变量中的原型方法
- 无法获取属性'selectedIndex'的未定义引用或null引用
- 如何在Javascript中使用共享的、不可变的引用类型来跟踪更改
- 为什么这种javascript继承会导致引用共享数组
- 如何在没有循环引用的控制器之间共享对象/方法
- 在ReSharper JavaScript测试中共享引用路径
- 对象被创建,但似乎共享一个引用
- 我可以从android共享引用中获取网络浏览器内的数据吗
- 在 JavaScript 和 ActionScript 之间共享数组引用
- 事件vs引用共享