我試圖在鉻控制檯下面執行。爲什麼Foo.prototype.isPrototypeOf(Foo)返回false?
function Foo() {}
console.log(Foo.prototype.isPrototypeOf(Foo)); // false
console.log(Object.prototype.isPrototypeOf(Object)); //true
第二行輸出false,而第三行輸出true。有人能解釋爲什麼嗎?
我試圖在鉻控制檯下面執行。爲什麼Foo.prototype.isPrototypeOf(Foo)返回false?
function Foo() {}
console.log(Foo.prototype.isPrototypeOf(Foo)); // false
console.log(Object.prototype.isPrototypeOf(Object)); //true
第二行輸出false,而第三行輸出true。有人能解釋爲什麼嗎?
發生這種情況是因爲所有對象都是對象,甚至是其原型。
但是Foo的原型(Foo.prototype)是一個與Foo不同的對象。
參見文檔https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype
Foo.prototype
不是富功能本身的原型。它是使用new Foo()
創建的任何對象的原型。功能Foo
的原型僅爲Function.prototype
。
console.log(Function.prototype.isPrototypeOf(Foo)); // true
console.log(Foo.prototype.isPrototypeOf(new Foo())); // true
在Object.prototype中的情況下,這就是原型鏈的最頂端,併爲任何不另有明確突破原型鏈返回true。在對象的情況下,因爲它是一個構造函數:
console.log(typeof Object); // function
console.log(Object.__proto__ === Function.prototype); // true
而且因爲Function.prototype的本身就是一個對象,然後:
console.log(Object.__proto__.__proto__ === Object.prototype); // true
這就是爲什麼console.log(Object.prototype.isPrototypeOf(Object));
是真的,因爲存在的Object.prototype在Object構造函數的原型鏈中。具體來說,它是函數原型的原型。
下面是這些對象和功能如何相關的圖表。藍色的矩形表示對象,圓角的綠色矩形是函數(這是一種特殊類型的對象)。粗黑線是每個對象的原型鏈,虛線表示使用構造函數的.prototype
屬性如何關聯對象。
感謝您的詳細解釋。 console.log(Function.prototype.isPrototypeOf(Foo); ** // true ** 以粗體顯示的文本應該在您的答案中爲錯誤,請更正它 –
@JyotiPrasadPal否,Function.prototype.isPrototypeOf(Foo)如果Foo是一個函數,它肯定是真的,你可以在控制檯中試試它,下面是一個演示原型鏈的小提示:https://jsfiddle.net/931e33an/3/ – PMV
對不起,我的壞。語法錯誤在下面的行中,你可以在最後修改小括號「)」。 console.log(Function.prototype.isPrototypeOf(Foo)); // true –