人们常说每个 Javascript 对象都有一个 prototype
属性,但我发现只有当 foo
时 foo.prototype
才有值是一个函数。
在 Chrome 和 Firefox 上,obj.__proto__
有一个值——这是 prototype
属性吗?但是在 IE 9 上,它不会工作(有什么方法可以吗?),我认为通过 prototype
属性,这意味着 obj.prototype
应该工作?
我明白 Object.getPrototypeOf(obj)
似乎显示了这个 prototype
属性,但为什么需要一个特殊的方法来获取它?为什么不像person.name
,就是获取person
对象的name
属性呢?
更新:顺便说一下,obj.constructor.prototype
似乎有时是原型(prototype),但有时不是,如下所示使用没有构造函数的原型(prototype)继承完成的代码:(此方法在 Apress 2008 年 Harmes 和 Diaz 的 Pro Javascript Design Patterns 一书中,第 46 页)
var Person = {
name: 'default value',
getName: function() {
return this.name;
}
}
var reader = clone(Person);
console.log(reader.getName());
reader.name = "Ang Lee";
console.log(reader.getName());
function clone(obj) {
function F() {};
F.prototype = obj;
return new F;
}
console.log("the prototype of reader is", Object.getPrototypeOf(reader));
console.log(Object.getPrototypeOf(reader) === reader.constructor.prototype);
console.log(Object.getPrototypeOf(reader) == reader.constructor.prototype);
console.log(Object.getPrototypeOf(reader) === reader.__proto__);
console.log(Object.getPrototypeOf(reader) == reader.__proto__);
最后 4 行结果将显示 false、false、true、true。
最佳答案
每个 JavaScript 对象都有一个内部“原型(prototype)”属性,通常称为 [[prototype]],它指向它直接继承的对象。这在 FF 和 Chrome 中通过非标准的 __proto__
属性公开。 Object.getPrototypeOf
是此内部属性的 getter。
每个 JavaScript 函数 [object] 都有一个属性 prototype
,它是用一个 [几乎] 空的对象初始化的。当您通过将其作为构造函数调用来创建此函数的新实例时,该新对象的 [[prototype]] 将指向构造函数的 prototype
对象。
如果你得到一个函数的 [[prototype]](每个函数都是一个对象,所以它有一个),它会产生 Function.prototype
对象,函数从中继承它们的方法(如绑定(bind)、调用、应用等)。另见 Why functions prototype is chained repeatedly?
关于javascript - 据说所有 Javascript 对象都有一个原型(prototype)属性,但如果 foo 是一个函数,我只看到 foo.prototype ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12661416/