Object.create创建的对象身上出现defineProperty劫持的属性?

const obj = {}

let a = 1
Object.defineProperty(obj, 'age', {
  get: function () {
    console.log("get")
    return a
  },
  set: function (newVal) {
    console.log('set')
    a = newVal
  }
})

const o = Object.create(obj)
console.log("obj:", o)

image.png

阅读 1.6k
2 个回答

可以直接看MDN对于 Object.create() 的说明:

Object.create() 方法用于创建一个新对象,使用现有的对象来作为新创建对象的原型(prototype)

所以其实就是浅拷贝了一个 obj 并且原型指向 obj。但其实 o 是一个空对象,可以从 Object.hasOwn(o,'age') 返回 false 看出来。

具体实现可以从 ECMA所定义的规范 中了解到:

20.1.2.2 Object.create ( O, Properties )

It performs the following steps when called:

  1. If Properties is not undefined, then

    • a. Return ? ObjectDefineProperties(obj, Properties).

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

Object.create 实现原理:

Object.create =  function (o) {
    var F = function () {};
    F.prototype = o;
    return new F();
  }

Object.create不是浅拷贝一个对象,而是内部创建一个空对象并将原型链指向传入的对象。

你贴的代码中,o对象实际上是一个空对象,但它的原型链指向了obj,所以访问 o.age时,o会在自己内部查找是否有age属性,由于是空对象没有找到,接着会沿着原型链查找obj对象,此时obj对象有'age'属性且被劫持了,就会返回被劫持的值

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏