什麼導致一個共同的困惑是作爲一個對象的功能具有.__proto__
屬性和作爲一個函數具有.prototype
屬性。他們有不同的含義。
大多數JavaScript
對象有一個原型對象,可以使用Object.getPrototypeOf()
方法訪問,或者簡單地使用.__proto__
屬性。這是用於重用代碼的對象,當屬性訪問器無法在對象上查找請求的屬性時,將查詢該對象,然後查看其原型。這是一種常用的方法,如.apply
在功能上可用。 這是你如何在你的榜樣訪問該對象:
Object.getPrototypeOf(myFunc); //function(){}
只有函數有.prototype
屬性,它是用來通過new
操作使用功能創建新對象時。當用new
運算符調用一個函數並創建一個新對象時,JS會檢查該函數的.prototype
屬性。如果它指向一個對象,JS將該對象設置爲新創建對象的原型。這就是爲什麼在你的例子對象的.prototype
是undefined
:
a = {};
console.log(a.prototype); // undefined
是否有人可以解釋這種現象?
secondConstructor.prototype.constructor = secondConstructor;
對象的constructor
屬性通常指向用於創建對象的函數。當聲明一個函數時,該屬性將自動創建在該函數的.prototype
屬性所指向的對象上。
function c() {}
c.prototype.constructor === c; // true
var o = new c();
o.constructor === c; // true
然而,這個屬性可以很容易地改變:
c.prototype = {constructor: function notCAnymore() {}}
var o = new c();
o.constructor === c; // false
現在我們沒有正確的函數的引用了。因此,改變後的原型,我們可能需要恢復.constructor
屬性:
c.prototype = {constructor: function notCAnymore() {}}
c.prototype.constructor = c; // restoring the correct constructor
var o = new c();
o.constructor === c; // true
而這正是在上面的例子一樣。原型被改變:
secondConstructor.prototype = new firstConstructor;
如果創建的對象現在指向正確的構造器丟失:
var o = new secondConstructor();
o.constructor === secondConstructor; // false
這就是爲什麼他們使用此代碼,將其還原:
secondConstructor.prototype.constructor = secondConstructor;
var o = new secondConstructor();
o.constructor === secondConstructor; // true
您好,我無法解釋該行爲,但我可以告訴你改用typeof myFunc ===「function」。另一方面typeof {} ===「object」 –
_「有人可以解釋這種行爲嗎?」_你究竟想向我們展示什麼?普通對象沒有'.prototype'屬性。這並不意味着功能不是對象。 – JLRishe
@JLRishe我沒有試圖展示任何東西 - 而是等待有人向我展示如何在JS中實現上述對象的不一致。請查看Maximus的答案以獲取更多信息。 –