Sof*_*tic 6 javascript oop function-prototypes
我有这个问题... B是基类,A是派生类...虽然A是从B派生的,但是A的各个对象指向B的同一个对象.
我知道我已经将A的对象分配给A的原型以使B的孩子成为B.
但是A的不同对象,它们应该有不同的地址空间来容纳变量,对吧?你能纠正这个吗?
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
Run Code Online (Sandbox Code Playgroud)
我应该在此代码中做出哪些更改,以便为我提供以下结果.
a.obj === b.obj //must be false
a instanceof A; //must be true
a instanceof B; //must be true
Run Code Online (Sandbox Code Playgroud)
这就是为什么原型上不应该有可变值(特别是对象或数组) - 相同的值将在所有对象实例之间共享,并且可以在其中任何一个实例中进行更改。这里你可以通过使用Object.create来避免这个问题,它B在创建原型时不会调用构造函数:
A.prototype = Object.create(B.prototype);
Run Code Online (Sandbox Code Playgroud)
然后,的构造函数A应该为每个新对象调用 的构造函数B:
function A() {
B.call(this);
}
Run Code Online (Sandbox Code Playgroud)
对于不支持的浏览器,Object.create()您可以按照http://javascript.crockford.com/prototypal.html上提到的方式模拟它。