new Object 和 Object.create()的区别?

对象字面量和new Object()方式创建的对象的隐式原型(__proto__)都会指向 Object的显示原型上(也就是Object.prototype)

// 对象字面量
const obj1 = {
  a: 10,
  b: 20,
  sum: function () {
    return this.a+this.b
  }
}


// new Object
const obj2 = new Object({
  a: 10,
  b: 20,
  sum: function () {
    return this.a+this.b
  }
})

console.log(obj1 === obj2)  // false
console.log(obj1.__proto__ === Object.prototype)  // true
console.log(obj1.__proto__ === obj2.__proto__) // true

// 但是如果用new Object创建对象的时候,如果传入的参数是一个已经定义好的对象的变量,那么创建的对象就跟参数本身是指向同一个对象的。
const obj2 = new Object(obj1) 
console.log(obj1 === obj2)  // true

Object.create()

// 当我们用 Object.create创建一个对象,并且参数为null的时候,会创建一个空对象
// 此时这个空对象是没有原型的
const obj3 = Object.create(null)
console.log(obj3)
image.png
// 当我们用new Object()方式创建一个空对象的时候,空对象是有原型的。
const obj4 = new Object()
console.log(obj4)
image.png
// 我们通过给Object.create()传一个对象作为参数创建对象
// 此时的对象依然是空对象,但是这个空对象的原型已经是指向了传入的这个参数了
const obj5 = Object.create({
  a: 10,
  b: 20,
  sum: function () {
    return this.a+this.b
  }
})
console.log(obj5)
image.png
// 这里的意思是,我们以obj1为原型,创建一个对象,并把对象赋值给obj6
// 此时obj6可以通过原型获取到obj1的所有属性和方法
// 当obj1的属性改变时,obj6也会改变
const obj6 = Object.create(obj1)
console.log(obj1)
console.log(obj6)
console.log(obj6.__proto__ === obj1) // true
obj1.c = 100
console.log(obj6.c)
image.png

你可能感兴趣的:(new Object 和 Object.create()的区别?)