Prototype是否是其构造函数的一个实例?

时间:2013-04-29 17:46:23

标签: javascript prototype

代码如下:

 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。上面的输出是chrome。 第一个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是一个教师的实例。谁能为我澄清一下?非常感谢。

2 个答案:

答案 0 :(得分: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属性,后跟函数。

答案 1 :(得分: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}