new出來的實例對象可以:數組
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