在原型上定义函数时,是否在每个新实例上重新创建了函数?

时间:2014-04-18 16:01:56

标签: javascript prototype

我在javascript中有以下代码,我不清楚以下原型的基本功能:

function TestClass()
{
}

var externalFunction = function() {
    console.log("hit the function defined internally");
};

Object.defineProperty(TestClass.prototype, "myFunction", {
    enumerable: false,
    writable: false,
    value: externalFunction
});

TestClass.prototype.myFunction2 = function() {
    console.log("hit the function defined on the prototype");
}

var tc = new TestClass();
var tc2 = new TestClass();

console.log(tc.myFunction === tc2.myFunction);
console.log(tc.myFunction2 === tc2.myFunction2);

每当定义新的myFunction时,都会重新创建myFunction2TestClass(),或者新的TestClass()是否包含指向原始myFunction的指针和myFunction2?

1 个答案:

答案 0 :(得分:3)

使用TestClass函数创建的每个对象作为构造函数,例如

var test1 = new TestClass();
var test2 = new TestClass();

将拥有相同的原型。当您尝试调用该函数时会发生什么:

test2.myFunction2();

是JS解释器将在test2引用的对象上查找myFunction2。它没有myFunction2属性,所以它查找链以查看test2的原型是否有一个名为“myFunction2”的类型函数的属性 - 它做了,所以它调用它。

所以回答这个问题:

  

或者新的TestClass()是否包含指向原始myFunction和myFunction2的指针?

使用新TestClass()创建的对象将包含对对象(它的原型)的引用,该对象包含对这两个函数的引用。请注意,新对象与其原型之间的引用有点秘密,请参阅:

here

这可能是一个极端混乱的根源,因为有两个叫做“prototype”的东西 - 有一个叫做“prototype”的构造函数的属性,还有一个秘密链接(叫做 proto 在webkit中)。代码似乎比写下来容易得多:

var TestClass = function() {}
TestClass.prototype = {
   method: function() {}
};

var a = new TestClass();
console.log(a.__proto__ === TestClass.prototype); // true
console.log(a.method === TestClass.prototype.method); // true