最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript?new.target的學習筆記

 更新時間:2025年08月01日 08:29:01   作者:明長歌  
new.target是一個元屬性(meta?property),在ECMAScript?2015?(ES6)?中引入,用于檢測函數(shù)是否通過new關(guān)鍵字調(diào)用,下面就來具體介紹一下javascript?new.target,感興趣的可以了解一下

new.target

new.target 是一個元屬性(meta property),在ECMAScript 2015 (ES6) 中引入,用于檢測函數(shù)是否通過 new 關(guān)鍵字調(diào)用。簡單來說,當一個函數(shù)用 new 關(guān)鍵字調(diào)用時,new.target 會指向這個函數(shù)本身;如果函數(shù)是直接調(diào)用,new.target 的值則為 undefined。

function Foo() {
  console.log('new.target',new.target)
  console.log('new.target.prototype',new.target.prototype)
  if (!new.target) {
    throw new TypeError("calling Foo constructor without new is invalid");
  }
}

try {
  new Foo();
  Foo();
} catch (e) {
  console.log(e);
  // Expected output: TypeError: calling Foo constructor without new is invalid
}
// 輸出:
/*
"new.target" function Foo() {
  console.log('new.target',new.target)
  console.log('new.target.prototype',new.target.prototype)
  if (!new.target) {
    throw new TypeError("calling Foo constructor without new is invalid");
  }
}
 "new.target.prototype" Object {  }
 */
 /*
 "new.target" undefined
 TypeError: Cannot read properties of undefined (reading 'prototype')
 */

new.target 保證是一個可構(gòu)造的函數(shù)值或 undefined。

在類構(gòu)造函數(shù)中,它指向 new 調(diào)用的類,這可能是當前構(gòu)造函數(shù)的子類,因為子類通過 super() 傳遞調(diào)用了父類的構(gòu)造函數(shù)。

在父類的構(gòu)造函數(shù)里,new.target 并不等于父類本身,而是“真正被 new 的那個類”——往往正是它的某個子類。因為子類在構(gòu)造時要先 super(),于是父類構(gòu)造函數(shù)的 new.target 就指向了子類。

class Animal{
    constructor() {
        console.log('Animal -> new.target.name:', new.target.name);
    }
}
class Dog extends Animal{
    constructor() {
        super();
        console.log('Dog -> new.target.name:', new.target.name);
    }
}
class toyDog extends Dog{
    constructor() {
        super();
        console.log('ToyDog -> new.target.name:', new.target.name);      
    }
}
new Dog();
// Animal -> new.target.name: Dog
// Dog -> new.target.name: Dog
console.log('----------------');
new toyDog();        
// Animal -> new.target.name: toyDog
// Dog -> new.target.name: toyDog
// ToyDog -> new.target.name: toyDog

在普通函數(shù)中,如果函數(shù)是直接通過 new 構(gòu)造的,則 new.target 指向函數(shù)本身。如果函數(shù)不是通過 new 調(diào)用的,則 new.targetundefined。函數(shù)可以被用作 extends 的基類,這種情況下 new.target 可能指向子類。

function Foo(msg) {
    console.log(msg, '--new.target =', new.target);
}
// 通過 `new` 構(gòu)造的,則 `new.target` 指向函數(shù)本身
new Foo('new Foo');
/* 輸出:new Foo --new.target = ? Foo(msg) {
    console.log(msg, '--new.target =', new.target);
} */
// 不是通過 `new` 調(diào)用的,則 `new.target` 是 `undefined`
Foo('call Foo');  
/* 輸出:call Foo --new.target = undefined */

// 函數(shù)可以被用作 `extends` 的基類,這種情況下 `new.target` 可能指向子類。
class Bar extends Foo {
    constructor() {
        super('new Bar');
    }
}
new Bar();
/* 輸出:new Bar --new.target = class Bar extends Foo {
    constructor() {
        super('new Bar');
    }
}  */     

如果構(gòu)造函數(shù)(類或者函數(shù))是通過 Reflect.construct() 調(diào)用的,那么 new.target 指向作為 newTarget 傳遞的值(默認為 target)。

function One(name) {
    this.name = name;
    console.log('One -> new.target.name:', new.target.name);
}
const obj=Reflect.construct(One, ['aa'], Array);
console.log(obj); // 輸出:Array {name: 'aa'}
console.log('obj instanceof One:', obj instanceof One); // 輸出:obj instanceof One: false
console.log('obj instanceof Array:', obj instanceof Array); // 輸出:obj instanceof Array: true

在箭頭函數(shù)中,new.target 是從周圍的作用域繼承的。如果箭頭函數(shù)不是在另一個具有 new.target 綁定的類或函數(shù)中定義的,則會拋出語法錯誤。

class A {
    constructor() {
        const arrow = () => console.log('new.target →', new.target);
        arrow();          // 箭頭函數(shù)繼承自構(gòu)造函數(shù)作用域
    }
}
class B extends A {}
new B();
//輸出:new.target → class B extends A {}
// 在全局作用域里
const arrow = () => {
    console.log(new.target); // 報錯:ReferenceError
};
arrow();
//輸出報錯:Uncaught SyntaxError: new.target expression is not allowed here

在靜態(tài)初始化塊中,new.targetundefined

class WithStatic {
   static {
        console.log('Static block new.target:', new.target); // undefined
    }
}
new WithStatic();
// 輸出:Static block new.target: undefined

參考:

MDN new.target

到此這篇關(guān)于javascript new.target的學習筆記的文章就介紹到這了,更多相關(guān)javascript new.target內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript函數(shù)綁定用法實例分析

    JavaScript函數(shù)綁定用法實例分析

    這篇文章主要介紹了JavaScript函數(shù)綁定用法,結(jié)合實例形式分析了javascript函數(shù)綁定的原理、實現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • UniApp?WebView頁面中的請求跨域問題解決

    UniApp?WebView頁面中的請求跨域問題解決

    在使用UniApp開發(fā)中,通過WebView組件加載本地網(wǎng)頁時,往往會遇到跨域問題,下面這篇文章主要介紹了UniApp?WebView頁面中的請求跨域問題解決的相關(guān)資料,需要的朋友可以參考下
    2024-10-10
  • js?實現(xiàn)picker?選擇器示例詳解

    js?實現(xiàn)picker?選擇器示例詳解

    這篇文章主要為大家介紹了js?實現(xiàn)picker?選擇器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Bootstrap所支持的表單控件實例詳解

    Bootstrap所支持的表單控件實例詳解

    Bootstrap 支持最常見的表單控件,主要是 input、textarea、checkbox、radio 和 select。本文通過實例代碼給大家講解Bootstrap所支持的表單控件,感興趣的朋友一起學習吧
    2016-05-05
  • 前端安全之DOMPurify基礎(chǔ)安裝與用法

    前端安全之DOMPurify基礎(chǔ)安裝與用法

    這篇文章主要介紹了前端安全之DOMPurify基礎(chǔ)安裝與用法的相關(guān)資料,DOMPurify是防御XSS攻擊的HTML凈化庫,支持npm/yarn安裝及CDN引入,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-06-06
  • 原生JavaScript和Vue實現(xiàn)從百度地圖抓取經(jīng)緯度

    原生JavaScript和Vue實現(xiàn)從百度地圖抓取經(jīng)緯度

    在前端開發(fā)中,使用百度地圖 API 來獲取用戶的經(jīng)緯度是一種常見需求,本文提供了使用原生 JavaScript 和 Vue.js 實現(xiàn)從百度地圖抓取經(jīng)緯度的詳細示例,需要的可以了解下
    2024-11-11
  • JavaScript中的對象繼承關(guān)系

    JavaScript中的對象繼承關(guān)系

    這篇文章主要介紹了JavaScript中的對象繼承關(guān)系的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • 關(guān)于在IE下的一個安全BUG --可用于跟蹤用戶的系統(tǒng)鼠標位置

    關(guān)于在IE下的一個安全BUG --可用于跟蹤用戶的系統(tǒng)鼠標位置

    本篇文章小編將為大家介紹,關(guān)于在IE下的一個安全BUG --可用于跟蹤用戶的系統(tǒng)鼠標位置。需要的朋友可以參考一下
    2013-04-04
  • 原生javascript實現(xiàn)圖片輪播切換效果

    原生javascript實現(xiàn)圖片輪播切換效果

    這篇文章主要為大家詳細介紹了原生javascript實現(xiàn)圖片輪播切換效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Javascript中的方法鏈(Method Chaining)介紹

    Javascript中的方法鏈(Method Chaining)介紹

    這篇文章主要介紹了Javascript中的方法鏈(Method Chaining)介紹,本文講解了Javascript Method Chaining、Method Chaining 使用、Method Chaining VS prototype Chaining等內(nèi)容,需要的朋友可以參考下
    2015-03-03

最新評論

扶沟县| 巴林左旗| 平顺县| 屏东县| 乃东县| 阿巴嘎旗| 农安县| 揭西县| 锦州市| 台山市| 奉新县| 海淀区| 东丰县| 德惠市| 徐州市| 富锦市| 泗阳县| 寿宁县| 黄冈市| 大悟县| 凌云县| 五指山市| 拉孜县| 盈江县| 临夏县| 仁寿县| 乡宁县| 玛纳斯县| 江阴市| 巴彦淖尔市| 乌海市| 西乡县| 延长县| 巴南区| 莲花县| 巨鹿县| 峨眉山市| 西峡县| 浦东新区| 运城市| 吉隆县|