我已經閱讀并嘗試理解與這個問題類似的其他答案(比如這個),但是原型繼承的概念對我來說仍然不是很清楚。現在最讓我困惑的是,__proto__和之間的實際區別是什么[[ Prototype ]]?據我所知,這[[ Prototype ]]是一種“將一個物件與另一個物件聯系起來的內部鏈接”。但是當我在 youtube 上看到一個教程時,它變得模棱兩可,因為每當他們創建一個物件并且如果他們嘗試console.log在瀏覽器的控制臺中使用它記錄它時,它實際上具有該__proto__屬性,但是當我嘗試執行相同操作時,它會輸出[[ Prototype ]]。所以我想知道為什么會這樣?什么是““?提前致謝!:) 下面是在 chrome中輸出“[[ Prototype ]]”和在 firefox中輸出“<prototype>”的代碼。
function User(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
const user = new User("Someone", "Something");
console.log(user);
uj5u.com熱心網友回復:
雙方括號表示法來自 ECMAScript 規范,在該規范中它始終指代內部物體(欄位、屬性、槽等),但不是您可以在 JavaScript 代碼中使用的表示法。它是語言實作者的資訊,有助于精確定義語言的行為。
在控制臺中,您可能會看到用這些雙括號表示的資訊,就像在 Chrome 控制臺中一樣。Firefox 使用不同的符號:<prototype>.
現在到你問題的核心。物件與其原型物件之間的鏈接不是該物件自己的JavaScript 屬性。它是一個內部插槽:
內部槽對應于與物件相關聯并被各種 ECMAScript 規范演算法使用的內部狀態。內部槽不是物件屬性,它們不是繼承的。
您可以通過 獲取原型物件.__proto__,但該__proto__屬性是物件上的Object.prototypegetter 。這就像在回圈中運行:當你撰寫 時obj.__proto__,引擎需要知道原型鏈是什么,然后才能__proto__為你找到那個值,因為它需要通過繼承來獲取它——它不是它obj自己的屬性。為了找到繼承鏈接,引擎將使用內部“插槽” [[Prototype]]。
uj5u.com熱心網友回復:
每個物件的原型都保存在名為 as的內部槽中,[[prototype]]并且__proto__只是一個 getter/setter,在Object.prototype物件中定義,用于獲取[[prototype]]任何物件的內部槽的值。
例子:
const arr = [];
陣列的每個實體都Array.prototype作為它的原型。因此,在 的上述宣告中arr,[[prototype]]內部槽包含Array.prototype對以下運算式中的 和的參考:
arr.__proto__ === Array.prototype // true
arr.__proto__Array.prototype從內部[[prototype]]插槽獲取物件。
如上所述,__proto__它只是一個獲取[[prototype]]內部插槽值的 getter/setter,僅出于兼容性原因而存在。它不應該在現代 javascript 代碼中使用;應該使用以下兩種方法來設定/獲取任何物件的原型:
Object.setPrototypeOf()
Object.getPrototypeOf()
除了[[prototype]]Ecmascript 規范中提到的之外,還有其他內部插槽,我們撰寫的 javascript 代碼無法訪問這些內部插槽。
如果您需要了解有關內部插槽的更多資訊,請閱讀:
什么是 JavaScript 中物件的“內部插槽”?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314608.html
標籤:javascript 遗产 原型
