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

Javascript Prototype是否是其构造函数的实例?,javascript,prototype,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

代码如下:

 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、 以上输出为铬合金。 第一个console.log显示Teacher.prototype不是Teacher的实例,但第三个显示Teacher.prototype是Teacher的实例(直觉上),这是矛盾的

我知道第二个console.log是真的,因为Object.prototype在Teacher.prototype的prototype链中,确切地说是
Teacher.prototype.\uuu proto\uuu===Object.prototype
。因此,第一个console.log应该输出false


但我不明白为什么第三个console.log的输出显示Teacher.prototype是Teacher的一个实例。谁能帮我澄清一下吗?非常感谢。

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

这适用于除prototype对象之外的所有对象,因为它们的
构造函数
属性指的是它们作为原型的函数,而不是从中创建它们的构造函数

示例:

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}

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

这适用于除prototype对象之外的所有对象,因为它们的
构造函数
属性指的是它们作为原型的函数,而不是从中创建它们的构造函数

示例:

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}
但我不明白为什么第三个console.log的输出显示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对象(与函数一起创建,可通过
.Prototype
访问)也有一个
.constructor
属性,该属性跟随函数返回

但我不明白为什么第三个console.log的输出显示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对象(与函数一起创建,可通过
.Prototype
访问)也有一个
.constructor
属性,该属性位于函数后面。

是的,看起来就是这样。如果将其覆盖为
Teacher.prototype.constructor=Array
,则在执行
Teacher.prototype
,它将在控制台中使用
Array
。是的,看起来就是这样。如果将其覆盖为
Teacher.prototype.constructor=Array
,则在执行
Teacher.prototype
操作时,它将在控制台中使用
Array