new 和 Object.create()區別

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

從執行過程和例子可以看出,newObject.create創建的的實例都具備prototype的屬性和參數,但是new創建的實例執行了原來的構造函數A使新對象具備了原構造函數A自身的屬性,而Object.create先創建一個空構造函數F,再進行new F()操作,原構造函數A的自身屬性不被繼承.

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