对象字面量和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
网友评论