new 和 Object.create()區別
new
操作符創建一個對象的過程
- 創建一個對象obj
- 將obj連接到原型鏈上,即設置
obj.__proto__ = Constructor.prototype
- 綁定this指向,傳參執行原型函數(參數應用到obj對象上)
- 判斷執行結果,沒有則返回obj
/* 手寫方法 */
function myNew() {
/* 創建新對象 */
let obj = new Object();
/* 構造函數,取第一個傳入的參數,arguments不是數組,不存在shift方法 */
let Constructor = [].shift.call(arguments);//Person
/* 原型鏈 */
obj.__proto__ = Constructor.prototype;/* obj->Person.prototype->Person */
/* 綁定this指向傳值,獲取返回值 */
let res = Constructor.apply(obj, arguments);//Person(name,age)
/* 若結果不是對象則返回obj */
return typeof res === 'object' ? res : obj;
}
Object.create
創建一個對象的過程
- 創造一個空構造函數
- 將空的構造函數prototype設爲傳入的prototype
- 返回實例
Object.create = function (prototype) {
var F = function () { };
F.prototype = prototype;
return new F();
};
舉例:
function A(name) {
this.name = "AAA";
}
A.prototype.age = 18;
// new
let a1 = new A();
console.log(a1);//A { name: 'AAA' }
console.log(a1.age);//18
// Object.create
let a2 = Object.create(A.prototype);
console.log(a2);//A {}
console.log(a2.age);//18
從執行過程和例子可以看出,new
和Object.create
創建的的實例都具備prototype
的屬性和參數,但是new
創建的實例執行了原來的構造函數A
使新對象具備了原構造函數A自身的屬性
,而Object.create
先創建一個空構造函數F
,再進行new F()
操作,原構造函數A
的自身屬性不被繼承.