new的過程
函數調用時前面不加new就按普通函數來 執行。加new后對其進行了相應的變動, 按構造函數來執行。
new的具體過程如下:
//例子:
function Person(name,age) {
this.userName = name;
this.userAge = age;
}
var personl = new Person('LULU',20)
1、創建一個新的空對象。(即實例對象)
obj = {}
2 、設 置 原 型 鏈
將新對象obj的 __proto__屬性指向構造函數的prototype 對象。(即所有實例對象通過__proto__可 以訪問原型對象。構造函數的原型被其所有實例對象共享。)
obj.__proto__= Person.prototype
3 、將構造函數的thi s改指向新對象ob j并 執行函數代碼。
(即給實例對象設置屬性 userName, userAge并賦值。)
var result = Person.apply(obj,['LULU',20])
4 、如果構造函數中沒有人為返回一個對象 類型的值,則返回這個新對象obj。否則直 接返回那個對象類型值。(一般定義的構造 函數中不寫返回值。)
if (typeof(result) == 'object') {
return result;
}else{
return obj;
}
手動實現一個new操作,參數為構造函數 及其傳參
//構造函數
function Person(name,age) {
this.userName = name;
this.userAge = age;
}
Person.prototype.sayAge = function(){
console.log(this.userAge)
}
// new操作函數newFun
function newFun() {
var obj = {};
Constructor = [].shift.call(arguments);
obj.__proto__ = Constructor.prototype;
var ret = Constructor.apply(obj, arguments);
return typeof ret === 'object' ? ret: obj;
};
//調用 newFun
var s1 = newFun(Person, 'xiaoyun',20);
console.log(s1.userName) //xiaoyun
console.log(s1.sayAge()) //20
備注:[].shift.call(arguments):刪除并返回參數列表arguments中第一個參數,即獲得構造函數。arguments剩余參數為構數傳參。arguments是類數組,沒有數組方法shift,可更改shift方法的this指向從而運用到 arguments 上。
數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。