如果寫了一個 new ,那麼 new 究竟做了什麼呢?
做了四件事:
- 建立了一個空物件
- 繫結this值
- 連結到原型
- 返回新物件
舉個例子:
function F(){
}
let o = new F();
複製程式碼
四件事:
1.建立了一個物件 let o = {}
2.繫結this值 F.call(o)
3.連結到原型 o._ _ proto_ _ = F.prototype
4.返回新物件 return o
方法(function)簡寫後不支援new,箭頭函式也不支援new
模擬實現new
function create(){
//建立一個空物件
let obj = new Object();
//獲取建構函式
let Constructor = [].shift.call(arguments);
//連結到原型
obj.__proto__ = Constructor.prototype;
//繫結this
let result = Constructor.apply(obj,arguments);
//返回新物件,(如果返回值是一個物件就返回該物件,否則返回建構函式的一個例項物件)
return typeof result === "object" ? result : obj;
}
複製程式碼
測試
function Test(name,age){
this.name = name;
this.age = age;
}
let Test1 = new Test("Fan",20);
console.log(Test1.name); // Fan
console.log(Test1.age); // 20
let Test2 = create(Test,"Jun",22);
console.log(Test2.name); // Jun
console.log(Test2.age); // 22
複製程式碼
經測試,create()可用
new的原理
function Person(name){
this.name = name;
return {
}
}
Person.prototype.say = function(){
console.log("say....")
}
function myNew(){
let Constructor = [].shift.call(arguments)
let obj = {};
obj.__proto__ = Constructor.prototype
let r = Constructor.apply(obj,arguments)
return r instanceof Object ? r : obj;
}
let p = myNew(Person,"Fan")
console.log(p.name)
p.say()
複製程式碼