使用javascript对象原型扩展类时出现问题

使用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 =

我有这个问题。。。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 = 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的实例