【问题标题】: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 中回答。

标签: javascript oop


【解决方案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));
      

      【讨论】:

        猜你喜欢
        • 2014-12-26
        • 1970-01-01
        • 2011-03-27
        • 1970-01-01
        • 1970-01-01
        • 2014-09-12
        • 2020-05-13
        • 2015-07-01
        • 2021-08-01
        相关资源
        最近更新 更多