使用javascript对象原型扩展类的问题

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)

Wla*_*ant 4

这就是为什么原型上不应该有可变值(特别是对象或数组) - 相同的值将在所有对象实例之间共享,并且可以在其中任何一个实例中进行更改。这里你可以通过使用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上提到的方式模拟它。