面試第二題 new 操作符 具體幹了什麼?

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。

謝謝大家,個人能力有限,難免有錯,正在學習中,希望大家多加指導。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章