2013-04-29 55 views
1

代码如下:原型是它的构造函数的一个实例吗?

function Teacher(name, age) { 
     this.name = name; 
     this.age = age; 
    } 
    Teacher.prototype.sayName = function() { 
     alert(this.name); 
    }; 
    Teacher.prototype.sayHi = function() { 
     alert("Hi, I'm " + this.name); 
    }; 
    console.log(Teacher.prototype instanceof Teacher); // false 
    console.log(Teacher.prototype instanceof Object); // true 
    console.log(Teacher.prototype); // Teacher {sayName: function, sayHi: function} 

p.s.上面的输出是铬。 第一个console.log显示Teacher.prototype不是Teacher的一个实例,但是第三个显示Teacher.prototype是Teacher的一个实例(直观地),这是矛盾的。

我知道第二个console.log是真的,因为Object.prototype在Teacher.prototype的原型链中,正好是Teacher.prototype.__proto__ === Object.prototype。因此,第一个console.log应该输出false。

但我很困惑为什么输出第三个console.log显示Teacher.prototype是Teacher的一个实例。任何人都可以为我澄清?非常感谢。

回答

1

这就是Chrome控制台选择显示对象的方式。它查看该对象的constructor属性,然后假定它是该构造函数的一个实例。

这对所有对象工作正常,但原型的对象,因为他们的财产constructor是指他们的原型,而不是他们从创建的构造函数的功能。

例子:

console.log(Teacher.prototype.constructor === Teacher); // logs true 

// Lets overwrite the constructor 
function Foo() {}; 
Teacher.prototype.constructor = Foo; 

console.log(Teacher.prototype); 
// logs Foo {sayName: function, sayHi: function} 
3

但我很困惑,为什么第三的console.log的输出显示Teacher.prototype是教师的一个实例。任何人都可以为我澄清?非常感谢。

您认为Teacher.prototype不是Teacher的实例。让我做一个猜测何老师来自于DevTools查看:

var obj = new Teacher(); 
obj.constructor;   // function Teacher 
obj.constructor.name;  // "Teacher" 

var proto = Teacher.prototype; 
proto.constructor;  // function Teacher 
proto.constructor.name; // "Teacher" 

看起来Chrome的DevTools控制台检查.constructor.name当漂亮的打印对象,这是合理的。原型对象(与功能一起创建并可通过.prototype访问)也具有.constructor属性,该属性紧跟在该函数之后。

+0

是的,看起来就是这样。如果将其覆盖到'Teacher.prototype.constructor = Array',则在执行'Teacher.prototype'时,它将在控制台中使用'Array'。 – 2013-04-29 18:04:18

相关问题