簡體   English   中英

為什么 Javascript 中的構造函數沒有 Function 作為它們的原型?

[英]Why don't constructor functions in Javascript have Function as their prototype?

我正在學習 Javascript,最近我對原型有了一些了解。 我對原型的理解是,它們實際上是內存中的對象,每個新創建的對象都有一個指向它的指針。 創建新對象時,用於創建該對象的構造函數將新創建的對象的原型分配為構造函數的原型。 換句話說,如果我有一個 Circle 構造函數,並且我創建了一個新的 Circle 對象,那么這個新對象和 Circle 構造函數都指向同一個引用。

我的問題是:如果原型應該引用創建對象的“父”對象,例如構造函數,為什么不構造函數,即函數和對象,指向“函數”構造函數作為它們的原型? 如果您嘗試像這樣創建一個新的構造函數:

function Circle() {}
let c1 = new Circle();

你會看到 c1 有以下作為它的原型,這是有道理的,因為 Circle 構造函數創建了它

Circle {}
__proto__:
constructor: ƒ Circle()
__proto__: Object

Circle.prototype是與上面相同的對象。 那么為什么Circle.prototype不指向Function作為原型呢?

正如您所觀察到的,以下是true

Object.getPrototypeOf(c1) === Circle.prototype

所以從邏輯上講,如果我們認為CircleFunction一個實例,那么:

Object.getPrototypeOf(Circle) === Function.prototype

您可以在下面確認:

 // let Circle = new Function(); /* also works here */ function Circle() {} let c1 = new Circle(); console.log(Object.getPrototypeOf(c1) === Circle.prototype); console.log(Object.getPrototypeOf(Circle) === Function.prototype);

Object.getPrototypeOf()方法返回指定對象的原型(即內部[[Prototype]]屬性的值)。

這不要與Circle.prototype混淆。 您可以在MDN 關於對象原型的文章中閱讀更多關於它們之間區別的信息,或者隨意瀏覽__proto__ VS 的任何答案 JavaScript 中的原型

請注意, Circle.__proto__Object.getPrototypeOf(Circle)是等效的,但__proto__是非標准的(盡管由於其向后兼容性的歷史用法,它碰巧在幾乎所有 JavaScript 實現中都有定義)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM