1 回答

TA貢獻1797條經驗 獲得超4個贊
你的第一個例子很簡單,與 Javascript 中“原型繼承”的工作方式相差甚遠。
一方面,Parent.call(property)
這肯定不是你的意思。此調用Parent
將其this
設置為property
,并且沒有傳遞任何參數,這絕對不是您想要的。我懷疑你的意思是Parent.call(this, property)
- 它調用Parent
與this
傳遞給相同的內容Child
,并傳遞property
參數。但這與“繼承”無關。
instanceof運算符只是檢查對象的“原型鏈”,以查看相關對象(prototype
您正在測試的“類”的屬性)是否出現在任何位置。操縱對象影響instanceof
操作者的唯一方法是改變原型鏈。
有很多方法可以做到這一點,但“偽造”JS(ES6 之前)中基于類的繼承之類的標準方法是這樣的:
function Parent(property) {
? ? this.property = property;
}
function Child(property) {
}
Child.prototype = Object.create(Parent.prototype);
const child = new Child("");
console.log(child instanceof Child);
console.log(child instanceof Parent);
它手動使從Child
委托構造的所有對象到Object.create(Parent.prototype)
,它本身就是一個從 繼承的對象(否則完全是空的并且沒有特殊屬性)Parent.prototype
。因此,現在當instanceof
檢查原型鏈時,它會找到它正在尋找的內容,因此返回true
,正如您從上面的代碼片段中看到的那樣。
當然,如果你確實想要在 JS 中基于類的繼承(我個人不推薦,但肯定很流行),ES6 語法class
提供了更好的語法糖,因此你不必手動弄亂原型鏈如上。但請注意,這本質上就是 ES6 類“幕后”發生的事情。
添加回答
舉報