国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

淺析JS中NEW的實現原理及重寫

2024-05-06 15:44:41
字體:
來源:轉載
供稿:網友

提到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;}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 广东省| 府谷县| 志丹县| 桐柏县| 谷城县| 高阳县| 永善县| 申扎县| 花垣县| 汤原县| 平塘县| 平湖市| 内黄县| 诸城市| 太康县| 巢湖市| 梅河口市| 吉水县| 新民市| 旅游| 成武县| 股票| 德清县| 茌平县| 淮北市| 惠州市| 喀什市| 当阳市| 清涧县| 揭阳市| 青田县| 永新县| 南郑县| 顺昌县| 泗洪县| 曲水县| 华坪县| 台北市| 乐陵市| 屏东市| 苏尼特左旗|