使用關鍵字new創建新實例對象經過了以下幾步:
1、創建一個新對象,如:var person = {};
(新對象的proto屬性指向構造函數的原型對象。)
2、將構造函數的作用域賦值給新對象。(也所以this對象指向新對象)
3、執行構造函數內部的代碼,將屬性添加給person中的this對象。
4、返回新對象person。
var person = {};
person._proto_ = Person.prototype;//引用構造函數的原型對象
Person.call(person);//將構造函數的作用域給person,即:this值指向person
Function.methos("new", function () {
//新創建一個對象,它繼承了構造器的原型對象。
var that = Object.create(this.prototype); //此時,this是指向Function構造器的。
//調用構造器,綁定this對象到新對象that上
var other = this.apply(that, argument); //此時,this對象指向that對象。
//如果它的返回值不是一個對象,就返回新的對象。
return (typeof other === "object" && other) || that;
});
通過new關鍵字創建某構造函數的新實例對象,就是將原型鏈與實例的this聯繫起來,this指向這個新對象,同時也指向這個構造函數,並且this對象還是這個構造函數的實例。如果沒有使用new操作符,直接用構造函數創建新實例對象,那麼this對象就指向了window對象,不會指向這個新對象的,不管給這個新對象添加什麼屬性,都沒有用,是直接添加到了window對象上了。