我們都知道在JS中通常通過對象字面量和new關鍵字來創建對象,那么今天我就來給大家講講new是怎么創建實例對象的;首先創建一個構造函數;
function Person(name,age){
this.name=name;
this.age=age;
};
var p=new Person('ck',16)
通過new可以創建構造函數Person的實例對象。那么我們怎么去實現這一功能的呢?下面就為大家揭曉謎底:
function New(fn){
return function(){
var obj={'__proto__':fn.prototype};
fn.apply(obj,arguments);
return obj;
}
}
var p1=New(Person)('chen',22)
p1.name;//打印chen
p1.age;//打印22
p1 instanceof Person // true 驗證p1是否是Person的實例對象。
這樣我們就可以自定義創建一個實例對象了。
1、首先呢通過創建一個New函數,該函數接收一個參數(要創建實例對象的構造函數);
2、然后函數內部返回一個匿名函數
3、匿名函數內部返回一個對象,該對象就是構造函數的實例對象;那么這里有一個問題就是我們要使New函數可以通用,那么就要知道每一個構造函數的實例對象的屬性;所以我在匿名函數的內部通過apply()方法用構造函數替換當前對象obj;同時將構造函數的執行上下文指向obj;故obj對象就繼承了構造函數的相關屬性。
好了,今天大概就分享一下這個吧,順便大家可以想下如果把obj對象的位置放到匿名函數的外面即New函數里面會有什么不同呢?
function New(fn){
var obj={'__proto__':fn.prototype};
return function(){
fn.apply(obj,arguments);
return obj;
}
}