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)
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)
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'属性且被劫持了,就会返回被劫持的值
8 回答4.6k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
可以直接看MDN对于 Object.create() 的说明:
所以其实就是浅拷贝了一个
obj
并且原型指向obj
。但其实o
是一个空对象,可以从Object.hasOwn(o,'age')
返回false
看出来。具体实现可以从 ECMA所定义的规范 中了解到: