2013-04-29 53 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

相關問題