原型属性抛出未定义 [重复]
Posted
技术标签:
【中文标题】原型属性抛出未定义 [重复]【英文标题】:Prototype property throwing undefined [duplicate] 【发布时间】:2015-01-29 10:34:27 【问题描述】:为什么instance
的原型property
会抛出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
?。
【问题讨论】:
因为你不能像这样得到对象的原型,所以没有这样的属性,因为原型没有作为属性公开。您可以使用Object.getPrototypeOf
方法获取它。例如:Object.getPrototypeOf(z) === Test.prototype
.
@dfsq 你不应该在 cmets 中回答。
【参考方案1】:
混淆的问题是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
【讨论】:
【参考方案2】:要获得原型,请使用Object.getPrototypeOf()
。因此,在您的示例中,请尝试使用 Object.getPrototypeOf(z)
【讨论】:
【参考方案3】:你应该在对象上使用getPrototypeOf
方法。像这样:
Object.getPrototypeOf(z);
你可以这样做:
Test.prototype=Object.getPrototypeOf(z);
console.log(Test.prototype);
console.log(Object.getPrototypeOf(z));
【讨论】:
以上是关于原型属性抛出未定义 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥“”.abcd 返回未定义的值而不是在 Javascript 中抛出未定义的错误(但 Typescript 抛出警告)
UICollectionView 使用自定义布局抛出未捕获的异常