我在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
时,都会重新创建myFunction2
或TestClass()
,或者新的TestClass()
是否包含指向原始myFunction
的指针和myFunction2?
答案 0 :(得分:3)
使用TestClass函数创建的每个对象作为构造函数,例如
var test1 = new TestClass();
var test2 = new TestClass();
将拥有相同的原型。当您尝试调用该函数时会发生什么:
test2.myFunction2();
是JS解释器将在test2引用的对象上查找myFunction2。它没有myFunction2属性,所以它查找链以查看test2的原型是否有一个名为“myFunction2”的类型函数的属性 - 它做了,所以它调用它。
所以回答这个问题:
或者新的TestClass()是否包含指向原始myFunction和myFunction2的指针?
使用新TestClass()创建的对象将包含对对象(它的原型)的引用,该对象包含对这两个函数的引用。请注意,新对象与其原型之间的引用有点秘密,请参阅:
这可能是一个极端混乱的根源,因为有两个叫做“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