为什么property
投掷instance
的原型undefined
?
function Test(name){
this.name = name;
}
Test.prototype = {
constructor: Test,
sayHello : function(){
console.log(this.name);
}
}
var z = new Test("Hello");
console.log(z.prototype); //undefined
console.log(zUtils.constructor); // Test
我可以通过z.sayHello(
)访问sayHello方法,那么为什么我的instance
prototype
返回我而不是Test.prototype
?
答案 0 :(得分:4)
混淆的问题是prototype
这个词有两个含义。
<强> 1。功能属性。任何函数都可以具有prototype
属性,这是一个对象。在你的情况下
Test.prototype = {
sayHello: function() {}
}
此对象的属性成为使用此构造函数构造的对象的继承属性和方法:
var z = new Test();
现在z
有一个方法属性sayHello
,您可以在Test.prototype
对象的帮助下进行配置。
<强> 2。实例原型。在您的情况z
中,实例对象具有内部对上述第1点的原型对象的引用。此引用在内部用于解析原型链中的属性和方法。但是,此引用不应直接可访问,并且您无法使用实例的prototype
属性访问此引用。
在chrome和Firefox中,您可以使用__proto__
属性,但不推荐使用它。
要获得在对象构建期间使用的原型,您应该使用Object.getPrototypeOf
:
Object.getPrototypeOf(z) === Test.prototype; // true
答案 1 :(得分:2)
要获得原型,请使用Object.getPrototypeOf()
。因此,在您的示例中,请尝试使用Object.getPrototypeOf(z)
答案 2 :(得分:0)
你应该在对象上使用getPrototypeOf
方法。就像这样:
Object.getPrototypeOf(z);
你可以这样做:
Test.prototype=Object.getPrototypeOf(z);
console.log(Test.prototype);
console.log(Object.getPrototypeOf(z));