JavaScript · 隨筆 new Object() vs. Object.create()

直接上代碼及比較結果吧,後續再補充:
// 對象構建:
var obj1 = {name:'hx'};
var obj2 = new Object({name:'hx'});
var obj3 = new Object(obj1);
var obj4 = Object.create({name:'hx'});
var obj5 = Object.create(obj1);

// 對象比較:
obj1 === obj2; // false
obj1 === obj3; // true (只此一個例外)
obj2 === obj3; // false

obj1 === obj4; // false
obj1 === obj5; // false
obj2 === obj4; // false
obj2 === obj5; // false

obj4 === obj5; // false

// 原型對象比較:
obj1.__proto__ === obj2.__proto__; // true
obj2.__proto__ === obj3.__proto__; // true

obj1.__proto__ === obj4.__proto__; // false
obj1.__proto__ === obj5.__proto__; // false
obj2.__proto__ === obj4.__proto__; // false
obj2.__proto__ === obj5.__proto__; // false

obj4.__proto__ === obj5.__proto__; // false
結論:
  • 引用類型比較的是內存地址,所以有:code

    • {a:1} === {a:1}; // false
  • var a = {}是一種語法糖,至關於var a = new Object({}),所以:對象

    • ({x:1}).__proto__.constructor === Object; // true
    • (new Object({y:2})).__proto__.constructor === Object; // true
  • Object.create建立的是一個「空」對象,不繼承Object的屬性和方法,所以:繼承

    • (Object.create(null)).__proto__; // undefined
    • (Object.create({})).__proto__.hasOwnProperty('__proto__'); // false
    • (new Object({})).__proto__.hasOwnProperty('__proto__'); // true
    • (Object.create({})).__proto__.__proto__.__proto__; // null
    • (new Object({})).__proto__.__proto__; // null
相關文章
相關標籤/搜索