JavaScript中new的原理以及實現

閱讀本文以前,您應該對原型鏈機制有所瞭解。segmentfault

1.new操做符的原理

1.new關鍵字會首先建立一個空對象
2.將這個空對象的原型對象指向構造函數的原型屬性,從而繼承原型上的方法
3.將this指向這個空對象,執行構造函數中的代碼,以獲取私有屬性
4.若是構造函數返回了一個對象res,就將該返回值res返回,若是返回值不是對象,就將建立的對象返回
理解了new的原理,手動實現就很簡單了.app

2.new操做符的實現

//由於new是關鍵字,我用函數的形式來實現,能夠將構造函數和構造函數的參數傳入
         function myNew(Fn,...args){
            //1.建立一個空對象,並將對象的__proto__指向構造函數的prototype 這裏我兩步一塊兒作了
            const obj=Object.create(Fn.prototype);
            //2.將構造函數中的this指向obj,執行構造函數代碼,獲取返回值 
            const res=Fn.apply(obj,args);
            //3.判斷返回值類型 
            return res instanceof Object ?res:obj
         }

測試函數

//構造函數
         function Person(name,sex){
             this.name=name;
             this.sex=sex
         }
         Person.prototype.getName=function(){
            return this.name
         }
  
         const zcy=new Person('zcy','男');
         const forceddd=myNew(Person,'forceddd','男');
         console.log(zcy);
         console.log(forceddd);
         console.log(zcy.getName());
         //共享原型上的方法
         console.log(zcy.getName===forceddd.getName);//true
僅爲我的理解,若有錯謬,歡迎指正。
若是對您有所幫助,請您點個贊吧!
相關文章
相關標籤/搜索