使用構(gòu)造函數(shù)擴(kuò)展natives類并將參數(shù)傳遞給super時的不同行為

創(chuàng)建繼承類的實(shí)例時,調(diào)用構(gòu)造函數(shù)和不調(diào)用構(gòu)造函數(shù)的不同行為:

1我通過構(gòu)造函數(shù)時的情況:

class MyArray extends Array {
    constructor(node) {
        console.log(node)
        super(node);
        console.log('nodes in constructor 1', node); // first
    }
};
let argument = ['first','second'];
let arr = new MyArray(...argument);

console.log(arr)// [first]

2自動發(fā)生的情況

class MyArray extends Array {};
let argument = ['first','second'];
let arr = new MyArray(...argument);

console.log(arr)// ['first', 'second']

有不同的行為請告訴我有什么區(qū)別,為什么會觀察到這種行為?提前感謝

? 最佳回答:

在子類中,如果不提供,JavaScript引擎將提供的默認(rèn)構(gòu)造函數(shù)如下所示:

constructor(...args) {
    super(...args);
}

將其與構(gòu)造函數(shù)進(jìn)行對比(刪除console.log調(diào)用):

constructor(node) {
    super(node);
}

請注意,您的版本僅將第一個參數(shù)傳遞給super,而默認(rèn)版本將所有參數(shù)傳遞給super

這就是為什么你看到了你所看到的行為,你的構(gòu)造函數(shù)忽略了除了第一個參數(shù)以外的一切。

如果您想對第一個參數(shù)執(zhí)行一些特殊操作,但仍然將所有參數(shù)傳遞給super,那么可以使用rest參數(shù):

constructor(node, ...rest) {
    // ...do something with `node`...
    super(node, ...rest);
    // ...
}

旁注:請注意Array構(gòu)造函數(shù)處理其參數(shù)的方式很奇怪,因為它所做的事情根據(jù)它接收到的參數(shù)的數(shù)量和類型而有所不同:

  • 如果它只收到一個number類型的參數(shù),它將創(chuàng)建一個空數(shù)組,其中length設(shè)置為該數(shù)字。
  • 如果它接收到多個參數(shù),或者一個類型不是number的參數(shù),它會將這些參數(shù)作為元素放入數(shù)組中。

當(dāng)子類化Array時,必須小心處理that...unusual行為。

主站蜘蛛池模板: 精品一区二区三区免费毛片爱| 精品无码国产一区二区三区51安 | 色综合视频一区二区三区44| 色一情一乱一伦一区二区三欧美| 国产美女av在线一区| 国99精品无码一区二区三区| 无码精品人妻一区二区三区免费| 精品欧洲AV无码一区二区男男| 国产精品一区二区三区99| 亚洲AV无码一区二区三区人| 中文字幕在线无码一区二区三区| 日韩精品免费一区二区三区| 亚洲一区二区三区高清不卡| 国产成人一区二区三区在线观看| 日本一区视频在线播放| 手机福利视频一区二区| 国产福利酱国产一区二区| 国产精品电影一区| 亚洲一区二区无码偷拍| 国产精品一区在线麻豆| 在线播放一区二区| 99久久人妻精品免费一区| 久久精品午夜一区二区福利| 性色A码一区二区三区天美传媒| 中文字幕一区二区三| 久久精品国产一区二区三区| 精品一区二区无码AV| 国模吧一区二区三区| 亚洲国产精品无码久久一区二区 | 久久精品国产亚洲一区二区三区 | 欲色影视天天一区二区三区色香欲| 国产精品一区二区毛卡片| 国产精品无码一区二区三区不卡 | 一区二区三区无码被窝影院| 国产精品视频免费一区二区| 国产亚洲综合一区二区三区| 亚洲乱码国产一区网址| 国产精品无圣光一区二区| 人妻体内射精一区二区三四| 亚洲日韩中文字幕无码一区| 国产精品一区二区三区高清在线 |