【问题标题】:Problem extending class with javascript object prototype使用 javascript 对象原型扩展类的问题
【发布时间】:2011-09-25 00:49:52
【问题描述】:

我遇到了这个问题……B是基类,A是派生类……事件虽然A是从B派生的,但是A的各个对象都指向B的同一个对象。

我知道我已将 B 的对象分配给 A 的原型,以使 A 成为 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

我应该在此代码中进行哪些更改,以便得到以下结果。

a.obj === b.obj  //must be false

a instanceof A;  //must be true
a instanceof B;  //must be true

【问题讨论】:

  • 你到底在问什么?您发布的代码有什么问题或预期行为有什么不同?
  • 请看一下,我已经更正了问题...

标签: javascript oop function-prototypes


【解决方案1】:

这就是为什么您不应该在原型上具有可变值(尤其是对象或数组)的原因 - 相同的值将在所有对象实例之间共享,并且可以在其中任何一个实例中进行更改。这里你可以通过使用Object.create来避免这个问题,在创建原型时不会调用B的构造函数:

A.prototype = Object.create(B.prototype);

A 的构造函数应该为每个新对象调用 B 的构造函数:

function A() {
  B.call(this);
}

对于不支持Object.create() 的浏览器,您可以按照http://javascript.crockford.com/prototypal.html 中的说明进行模拟。

【讨论】:

    【解决方案2】:

    值是通过引用分配的,并且由于 A 的所有实例都使用相同的 B 实例作为它们的原型,因此它们都引用相同的“B”。

    所以这正是这里所期望的。解决此问题的一种方法是(例如)为 B 的“类”添加一个“初始化”方法,然后您可以从 A 构造函数中调用该方法。

    你也可以使用'new B()'来定义原型,而是使用Object.create。 Object.create 不会调用 B 的构造函数,但是你可以从 A 调用父构造函数。

    function A() {
       B.call(this);
    }
    

    【讨论】:

    • 这个我试过了,我的第二个要求在这里不行……就是一个instanceof B == true
    【解决方案3】:

    这是Javascript中原型的一部分,我建议你阅读this excellent thread

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      相关资源
      最近更新 更多