手寫代碼之new

new都作了啥

new出來的實例對象可以:數組

  • 訪問構造函數裏的屬性
  • 訪問構造函數的原型對象上的屬性

圖解實現思路

image.png

實現代碼

function mynew(){
    let obj = new Object(), //從Object.prototype上克隆一個對象,做爲初始化,爲了方便後面賦值給函數的實例
        Constructor = [].shift.call(arguments); //取得第一個參數,即外部傳入的構造器,此外由於 shift 會修改原數組,因此 arguments 會被去除第一個參數
        
    let F = function() {};  //爲了使obj能經過F與Constructor.protptype產生關聯(要想兩個對象之間產生__proro__這樣的關聯,就須要新建一個函數,做爲構造函數,經過構造函數的原型指向對象二,對象一是構造函數的實例)
    F.prorotype = Constructor.prototype;
    obj = new F();
    //這樣obj,就能訪問構造函數Constructor .prototype上的屬性了
    Constructor.apply(obj, arguments);  //借用外部傳入的構造器給obj設置屬性
    
    return obj
}

語言描述

new出來的對象可以作到兩件事:一、訪問構造函數裏的屬性,二、訪問構造函數的原型對象上的屬性。因此若是手寫new的話就要實現:傳入構造函數和參數,返回一個對象(若是構造函數沒有默認返回的話),而且使原型對象在這個返回的對象的原型鏈上。app

首先聲明一個對象obj,從Object.prototype上克隆一個對象,而後從傳入的arguments裏獲取第一個參數,即構造函數。函數

而後再聲明一個匿名函數,使匿名函數的原型指到構造函數的原型上。this

再建立一個匿名函數的實例,賦給obj。spa

這樣obj,就能訪問構造函數Constructor .prototype上的屬性了。prototype

最後利用apply將傳入的構造函數的this的指向obj,而且給obj設置屬性。code

相關文章
相關標籤/搜索