我目前正在试图弄清楚原型继承在JavaScript中是如何工作的。这是我目前要解决的谜。
假设我们设置了以下结构:
var base = { greet : "hello" }
var child = function () {}
child.prototype = base;
child.prototype.protoSomething = function () {}
var instance = new child();
没什么特别的。现在让我们看看instance
对属性(拥有或其他)的含义:
for(prop in instance) {
console.log(prop); // prints 'greet', 'protoSomething'
}
好吧,它有greet
和protoSomething
,他们是instance
自己的成员吗?
for(prop in instance) {
if(instance.hasOwnProperty(prop))
console.log(prop); // nothing is printed
}
不,自己的财产清单是空的。它们是instance
的原型吗?
if(instance.prototype === undefined) {
console.log("'instance' has no prototype"); // gets printed
}
嗯,糟糕,instance
没有分配原型。那么,如果属性不是拥有并且没有原型,那么它们来自哪里?我觉得现在某种图表非常好。
答案 0 :(得分:4)
只有一个函数具有属性prototype
。
instance.constructor.prototype === base // return true
要获取对象的原型,您应该使用Object.getPrototypeOf方法。
Object.getPrototypeOf(instance) === base // return true
答案 1 :(得分:1)
此页面可以帮助您:
http://joost.zeekat.nl/constructors-considered-mildly-confusing.html
简而言之,实例的“幕后”原型(通过new
创建)无法以任何方式访问,因此它返回undefined
的原因。当您尝试检索它时,只有构造函数(您手动设置.prototype
属性)将返回任何内容。