使用javascript对象原型扩展类时出现问题
我有这个问题。。。B是基类,a是派生类。。。事件虽然A是从B派生的,但A的各种对象指向B的同一对象 我知道我已经给A的原型分配了一个B的对象,使其成为B的子对象 但是不同的对象应该有不同的地址空间来保存变量,对吗?你能纠正这个吗使用javascript对象原型扩展类时出现问题,javascript,oop,function-prototypes,Javascript,Oop,Function Prototypes,我有这个问题。。。B是基类,a是派生类。。。事件虽然A是从B派生的,但A的各种对象指向B的同一对象 我知道我已经给A的原型分配了一个B的对象,使其成为B的子对象 但是不同的对象应该有不同的地址空间来保存变量,对吗?你能纠正这个吗 function B(){ this.obj = {}; } function A(){ } A.prototype = new B(); var a = new A(); var b =
function B(){
this.obj = {};
}
function A(){
}
A.prototype = new B();
var a = new A();
var b = new A();
var c = new A();
console.log(a.obj == b.obj); //prints true
console.log(a.obj === b.obj); //prints true
a.obj.name = "stackoverflow";
console.log(b.obj.name); //prints stackoverflow
我应该在这段代码中做什么更改,以便得到以下结果
a.obj === b.obj //must be false
a instanceof A; //must be true
a instanceof B; //must be true
这是Javascript中原型的一部分,我建议您阅读。值是通过引用分配的,因为a的所有实例都使用与原型相同的B实例,所以它们都引用相同的“B” 这正是我们所期望的。解决这个问题的一种方法是(例如)在B“类”中添加一个“initialize”方法,然后可以从a构造函数中调用该方法 您也不能使用“new B()”来定义原型,而是使用Object.create。Object.create不调用B的构造函数,但您可以从A调用父构造函数
function A() {
B.call(this);
}
这就是为什么原型上不应该有可变值(特别是对象或数组)——相同的值将在所有对象实例中共享,并且可以在其中任何一个实例中更改。在这里,您可以通过使用在创建原型时不会调用
B
的构造函数来避免问题:
A.prototype = Object.create(B.prototype);
A
的构造函数应该为每个新对象调用B
的构造函数:
function A() {
B.call(this);
}
对于不支持
Object.create()
的浏览器,您可以像上面提到的那样模拟它。您到底在问什么?你发布的代码有什么问题,或者预期行为有什么不同?请看一看,我已经纠正了这个问题…我尝试了这个,我的第二个要求在这里不起作用。。。也就是说,B==true的实例