原型属性抛出未定义 [重复]

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 抛出警告)

Laravel 属于抛出未定义的错误

UICollectionView 使用自定义布局抛出未捕获的异常

bootstrap-datepicker 抛出未定义的 jQuery

自定义管理命令在虚拟环境中抛出未找到模块错误

Laravel 4 中的 Bllim DataTables 抛出未定义的 getQuery() 异常