亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Javascript原型繼承和“instanceof”

Javascript原型繼承和“instanceof”

千萬里不及你 2023-07-20 16:25:50
我只是無法理解,為什么在對象繼承中“instanceof”無法將“子”對象評估為父原型的實例。例如:function Parent(property) {    this.property = property;}function Child(property) {    Parent.call(property);}const child = new Child("");console.log(child instanceof Child); // of course, trueconsole.log(child instanceof Parent); // false. But why???至于類的繼承(或者說JS中被認為是類的東西),情況就不同了:class Parent {    constructor(property) {        this.property = property;    }}class Child extends Parent {    constructor(property) {        super(property);    }}const child = new Child("");console.log(child instanceof Child); // trueconsole.log(child instanceof Parent); // also true!!!造成這種差異的原因是什么?是否可以創建子對象,以便將它們正確地識別為其父原型的實例(無需求助于類)?
查看完整描述

1 回答

?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

你的第一個例子很簡單,與 Javascript 中“原型繼承”的工作方式相差甚遠。

一方面,Parent.call(property)這肯定不是你的意思。此調用Parent將其this設置為property,并且沒有傳遞任何參數,這絕對不是您想要的。我懷疑你的意思是Parent.call(this, property)- 它調用Parentthis傳遞給相同的內容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 類“幕后”發生的事情。

查看完整回答
反對 回復 2023-07-20
  • 1 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號