原型属性抛出undefined

时间:2014-12-01 12:09:00

标签: javascript oop

为什么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

3 个答案:

答案 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));