亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS中NEW的實現原理是什么

發布時間:2021-05-27 11:50:26 來源:億速云 閱讀:202 作者:小新 欄目:web開發

這篇文章主要介紹了JS中NEW的實現原理是什么,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

提到new,肯定會和類和實例聯系起來,如:

function Func() {
 let x = 100;
 this.num = x +
}
let f = new Func();

上面的代碼,我們首先創建了一個函數,如果是用面向對象的說法就是創建了一個Function類的實例,如果直接執行這個函數,那它就是一個普通的函數,如果用new執行,則這個函數被稱為一個自定義的類。

如果是一個普通函數執行,他會如下做幾件事:

  ·形成一個全新的執行上下文EC(Execution Context 執行環境)

  ·形成一個AO(Activation Object 活動對象)變量對象,初始化arguments和形參賦值

  ·初始化作用域鏈

  ·代碼執行

如果是new函數執行,它既有普通函數執行的一面,也有自己獨有的東西:

  ·默認創建一個對象,而這個對象就是當前類的實例

  ·聲明其this指向,讓其指向這個新創建的實例

  ·不論其是否寫return,都會把新創建的實例返回,這里有個特殊點,如果用戶自己返回內容,且返回的是一個引用類型值,則會把默認返回的實例給覆蓋掉,此時返回的值就不再是類的實例了

console.log(f); //=>{num:200}
//f是Func這個類的實例 
//相當于給創建的實例對象新增一個num的屬性 obj.num=200 (因為具備普通函數執行的一面,所以只有this.xxx=xxx才和創建的實例有關系,此案例中的x只是AO中的私有變量)
console.log(f instanceof Func); //=>TRUE instanceof用來檢測某一個實例是否屬于這個類

每一次new出來的都是一個新的實例對象

console.log(f === f2); //=>false

既然知道了new都做了什么事情,我們重新一下new:

/* 
 * 內置NEW的實現原理 
 * @params
 *  Func:操作的那個類
 *  ARGS:NEW類的時候傳遞的實參集合
 * @return
 *  實例或者自己返回的對象
 */
function _new(Func, ...args) {
  //默認創建一個實例對象(而且是屬于當前這個類的一個實例)
  let obj = {};

  //也會把類當做普通函數執行
  //執行的時候要保證函數中的this指向創建的實例
  let result = Func.call(obj, ...args);

  //若客戶自己返回引用值,則以自己返回的為主,否則返回創建的實例
  if ((result !== null && typeof result === "object") || (typeof result === "function")) {
    return result;
  }
  return obj;
}

我們試一下:

let f3 = _new(Func);
console.log(f3); // =>{num: 200}

我們繼續測試:

Func.prototype.log = function () {
  console.log('ok');
}
let f4 = _new(Func);
f4.log(); //=>Uncaught TypeError: f4.log is not a function

也就是說,Func原型上的方法其實例沒法調用,我們還需要修改:

/* 
 * 內置NEW的實現原理 
 * @params
 *  Func:操作的那個類
 *  ARGS:NEW類的時候傳遞的實參集合
 * @return
 *  實例或者自己返回的對象
 */
function _new(Func, ...args) {
  //默認創建一個實例對象(而且是屬于當前這個類的一個實例)
  // let obj = {};
  let obj = Object.create(Func.prototype);

  //也會把類當做普通函數執行
  //執行的時候要保證函數中的this指向創建的實例
  let result = Func.call(obj, ...args);

  //若客戶自己返回引用值,則以自己返回的為主,否則返回創建的實例
  if ((result !== null && typeof result === "object") || (typeof result === "function")) {
    return result;
  }
  return obj;
}

這樣應該就可以了。

let f6 = _new(Func);
f6.log(); //=>ok

JavaScript是什么

JavaScript是一種直譯式的腳本語言,其解釋器被稱為JavaScript引擎,是瀏覽器的一部分,JavaScript是被廣泛用于客戶端的腳本語言,最早是在HTML網頁上使用,用來給HTML網頁增加動態功能。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“JS中NEW的實現原理是什么”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长沙县| 贺州市| 闻喜县| 晋州市| 乌拉特中旗| 海伦市| 元氏县| 巴塘县| 潍坊市| 民和| 藁城市| 宜宾县| 沁阳市| 高清| 绥芬河市| 岫岩| 德清县| 汉源县| 玉龙| 阳原县| 锡林郭勒盟| 德格县| 田林县| 夹江县| 永福县| 郑州市| 浦城县| 杭锦后旗| 霍州市| 灵台县| 宁南县| 巫山县| 五莲县| 洞头县| 库车县| 黎平县| 泗水县| 孟村| 遂昌县| 盐津县| 南通市|