【问题标题】:Understanding behavior of prototype - JavaScript理解原型的行为 - JavaScript
【发布时间】:2015-01-14 06:44:04
【问题描述】:

我不明白为什么会发生以下情况:

我有以下代码:

singleton = (function() {
    somePrivFunction = function() {
        return new B();
    }

    A = function() {};
    B = function() {};
    C = function() {};

    A.prototype.a = function() { console.log("a"); };

    B.prototype = A.prototype;
    B.constructor = B;
    B.prototype.b = function() { console.log("b"); };

    C.prototype = A.prototype;
    C.constructor = C;
    C.prototype.c = function() { console.log("c"); };

    return { 
        someFunction: function() { 
            return somePrivFunction(); 
        }
    }
})();

当我调用singleton.someFunction() 时,它会返回一个B 的实例。然而,以下所有工作:

singleton.someFunction().b(); // Prints "b" 
singleton.someFunction().a(); // Prints "a" 
singleton.someFunction().c(); // Prints "c", but why? Shouldn't it be undefined?

【问题讨论】:

  • 你把 A、B、C 继承都弄错了。 Dog 是 Animal,但 Animal 不一定是 Dog,因此将一个原型设置为等于另一个原型是错误的。您可以改用 Object.create。以下答案可能会有所帮助:stackoverflow.com/questions/16063394/…

标签: javascript prototype javascript-objects


【解决方案1】:

B.prototype 引用了与A.prototype 相同的对象(第 12 行)。在第 16 行,您将同一对象的引用存储到 C.prototype。这意味着所有三个原型都指向同一个对象,因此对A.prototypeB.prototypeC.prototype 所做的所有更改实际上都会更改同一个对象。在您的代码末尾,此对象具有三个方法:a、b 和 c。

【讨论】:

  • 好的,我希望 B 和 C 只继承 A 的方法,而不是彼此的方法,有没有办法做到这一点?
  • @jaibatrik Do B.prototype = new A();
  • 有效。感谢您的解释!
  • @Dmitry 即使创建一个 Parent 的实例用作 Child 的原型意外地在这里工作没有问题我不建议这样做,最好使用 Object.create
  • @HMR 这不是 意外 在这里工作的。它是旧浏览器 (IE8-) 的唯一选择。除了 Object.create 只有 1 个参数等价于 new
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多