![](/img/trans.png)
[英]Why some functions in JS have a prototype.constructor prop and others don’t? What is the difference between these functions?
[英]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
所以從邏輯上講,如果我們認為Circle
是Function
一個實例,那么:
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.