一、場景
我們在使用JavaScript是,會經常碰上new這個操作符來進行實例化,我們來看一下new 這個操作符執行時走了哪些步驟
二、實例
function A(name){
this.name = name ;
};
var zhangsan = new Person('張三');
var zhangsans = new Person('張三');
console.log(zhangsan);//{name:張三};
console.log(zhangsan);//{name:張三};
console.log(zhangsan == zhangsans);//false;
console.log(zhangsan.__proto__ == zhangsans.__proto__);//true;
經過實例可以發現一個問題,zhangsan和zhangsans在方法與傳參上都是一樣的,最後比較方法是爲false ,比較方法的原型時卻是相等的,這就說明通過new實例化出來的方法是不相同的,原型比較爲true,證明參數源是一樣的
接下來看一下new的過程,一兩個方法來展示
function A(name){
this.name = name ;
};
function NewFun(fun,...param){
//1.首先創建一個空對象
var obj = {};
//2.設置原型鏈
obj.__proto__=fun.prototype;
//2.將空對象作爲 this,調用構造函數並傳入參數
var result=fun.call(obj,...param);
//4.如果構造函數返回值爲對象或者函數,則返回該對象或者函數,否則返回創建的新對象obj
return typeOf result === "object" || typeOf result === "function"?result:obj
}
NewFun(A,'張三')
默認情況下函數返回值爲undefined,即沒有顯示定義返回值的話,但構造函數例外,new構造函數在沒有return的情況下默認返回新創建的對象。
但是,在有顯示返回值的情況下,如果返回值爲基本數據類型{string,number,null,undefined,Boolean},返回值仍然是新創建的對象。
只有在顯示返回一個非基本數據類型時,函數的返回值才爲指定對象。在這種情況下,this所引用的值就會被丟棄了