✍️使用`对象字面量`创建的所有对象都有相同的原型对象

69 阅读2分钟

什么是对象字面量呢?他是一种形式,用于创建对象。如:

let obj1 = { name: 'jiang' } // 使用对象字面量形式创建的对象:obj1

JS 中,几乎每一个对象都会有一个与他相关联的对象,这个对象叫做原型(prototype)

那么上方定义的 obj1 的原型是什么呢?

console.log(Object.getPrototypeOf(obj1))
// {__defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, __lookupSetter__: ƒ, …}

之所以说使用对象字面量创建的所有对象都有相同的原型对象,是因为当我们使用对象字面量形式创建任意其他的对象,如 obj2 的时候:

let obj2 = { name: 'jiangjianqing' }

这个 obj2 的原型对象与 obj1 的原型对象会是一样的:

Object.getPrototypeOf(obj1) === Object.getPrototypeOf(obj2)
// true

这是为什么呢?

要回答这个问题,首先我们来讲一下什么是原型对象

前面我们说到了,几乎每一个对象都有原型,这个原型也是一个对象,所以我们称这个原型原型对象

举一个例子,A 是一个对象,它的的原型是 B,B 也是一个对象。所以我们说 :B 是 A 的原型对象。

所有使用对象字面量形式创建的对象的原型对象都是一样的,这些原型对象都一致地继承自Object.prototype:

Object.getPrototypeOf(obj1) === Object.prototype // true
Object.getPrototypeOf(obj2) === Object.prototype // true

问题又来了,Object.prototype是啥?

Object.prototype 是所有对象的原型

.prototype属性是啥?

在 JavaScript 中,.prototype 属性是构造函数( 一种特殊的函数,用于创建和初始化对象 )的一个属性,这个属性指向一个原型对象。( 即Object.prototype是一个对象 )

这个被.prototype属性所指向的原型对象被用作通过该构造函数创建的所有对象的共享属性和方法的存储地。

我下面举一个例子:

// 定义构造函数 构造函数约定首字母大写
function Person(name) {
  this.name = name
}

// 给Person这个构造函数的原型对象,也就是 Person.prototype 添加一个方法
Person.prototype.say = function () {
  console.log('中华人民共和国万岁!')
}

现在我们使用 Person 构造函数创建一个 Person 对象,然后调用我们定义在 prototype 上的 say 方法:

const p = new Person()
p.say() // 中华人民共和国万岁!

总结一下:使用对象字面量创建的所有对象都有相同的原型对象