理解原型的行为 - JavaScript

时间:2014-11-17 11:03:45

标签: javascript prototype javascript-objects

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

我有以下代码:

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?

1 个答案:

答案 0 :(得分:3)

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