首先要清楚類和對象之間的關系,然后要清楚實例化(new)的過程中發生了什么。
筆者認為類和對象的關系比較好理解,就如同要按照圖紙蓋一幢房子,圖紙就是類,房子就是對象。類是對象的抽象,對象是類的實體體現。
new的過程發生了什么呢?
var Person=function(name,age){ this.name=name; this.age=age; } Person.prototype.getName=function(){ return this.name; } var p1=new Person('Tom',12) p1.getName() //Tom
有上面的例子可知,new的過程中創建了一個對象,根據構造函數的結構,原型,及方法等全部賦給這個對象,最后返回這個對象。
實現代碼如下:
function New(fn){ var res = {}; if(fn.prototype !== null) { res.__proto__=fn.prototype; } // 將傳入構造函數的參數,在res上下文中執行一遍 var ret = fn.apply(res,Array.prototype.slice.call(arguments,1)); // 如果構造函數返回一個對象,則直接返回這個對象 if((typeof ret === 'object' || typeof ret === 'function') && ret !== null){ return ret; } return res; } var Person = function(name,age){ this.name=name; this.age=age; } Person.prototype.getName=function(){ return this.name; } var p1=New(Person,'Tom',12) console.log(p1.getName())//Tom