JavaScript new操作符具體幹了什麼呢?
在javascript 只要new 一個函數,就可以new一個對象,這應該算是JavaScript中函數式編程思想,這裏主要說明的是 在new的過程中發生了什麼?
1.具體主要有4個部分:
1.創建了一個新對象
2.把這個新對象的原型屬性(proto)綁定到原函數的prototype屬性(就是繼承原函數原型)
3.把原函數的this指向轉移到這個新對象上
4.返回新對象,如果這個函數沒有返回其他對象的話
如何手寫一個new操作符:
2.如何手寫一個new操作符:
/*實現new操作符的功能*/
function MyNew (fun,args) {
/*這裏是兩種創建新對象並綁定原型屬性的方法,沒有區別*/
let obj = {}; // => 1.創建一個新對象
obj.__proto__ = fun.prototype; // => 2.新對象繼承構造函數的原型
// let obj = Object.create(fun.prototype); // => 1.2 以fun的原型屬性創建一個新對象
let result = fun.apply(obj,args); //=> 3.改變原函數的this指向,是它指向新對象;如果函數有返回對象的話,用result來接收
return result instanceof Object? result : obj; //=> 4.返回新對象,如果原函數返回值是一個對象,則返回這個對象;
}
/*驗證是否實現new的功能*/
function Person (name,age) {
this.name = name;
this.age = age;
}
Person.prototype.sayName = function(){
console.log(this.name);
}
/*使用new的效果*/
let person1 = new Person('屠永濤',25);
person1.sayName(); // => 屠永濤
/*使用MyNew的效果*/
let person = MyNew(Person,['屠永濤','25']);
person.sayName(); // => 屠永濤
console.log(person); // => 這裏測試兩種創建新對象並綁定原型屬性的區別
3.其他創建對象的方式:
字面量 ,和Object.creat( );
1.字面量創建對象的優勢:
-
代碼量少,易讀
-
運行速度快,他會在解析的時候被優化,不會像new一樣解析器需要順着作用域鏈查找到全局構造函數Object( )構造函數爲止;
2.Object.create(ptoto,[propertiesObject])
proto: 指向新創建對象的原型對象
propertiesObject:爲新創建對象添加屬性和值;一般用於繼承
這種方式創建的對象沒有默認constructor,需要手動添加 //這裏自己不太把握,希望看到的大哥給指導下
其中new 和字面量創建的對象原型指向 Object.prototype ,Objec.creat(null) 的原型指向null。
謝謝大家,個人能力有限,難免有錯,正在學習中,希望大家多加指導。