代码如下:
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是一个教师的实例。谁能为我澄清一下?非常感谢。
答案 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}