使用 DefineProperty 在原型链中添加属性
Adding properties in prototype chains using DefineProperty
我发现 JavaScript 向对象添加属性的方式有所不同。下面的代码示例显示了它。
var t1 = {
x: 1
}
var t2 = {}
Object.defineProperty(t2, 'y', {
value: 2,
configurable: false,
writable: false
});
Object.setPrototypeOf(t1, t2);
t1.y = 100;
t1.y; --> returns 2
Object.defineProperty(t1, 'y', { value: 100 });
t1.y; --> return 100
t1 以 t2 为原型。我确保添加到 t2 的 属性 'y' 是不可配置且不可写的。当我尝试使用 t1.y = 100 将 y 添加到 t1 时,y 没有添加到对象中,t1.y 仍然是 return 2。但是,当使用 defineProperty 时,y 确实被添加到t1.
我认为这与 JavaScript 对待原型链的方式有关,但我无法理解它...
如果我们看一下 t1
和 t2
的样子,这会让这更容易理解..
在我们进行任何分配之前。
t1 = { x: 1 } -> proto { y: 2 }
t2 = { y: 2 }
现在我们尝试将 100 分配给 t1.y..
现在在 t1 的 defineProperty on 的原型上找到了 y,所以 100 被忽略,或者在严格模式下出错。
现在当我们在 t1 上定义 属性 时会发生什么。
t1 = { x: 1, y: 100 } -> proto { y: 2 }
t2 = { y: 2 }
IOW:您的 defineProperty 实际上应用于不同的对象,现在由于 属性 查找的工作方式,首先找到 y = 100
。如果您尝试在同一个对象上定义属性,如下所示,它将失败。
Object.defineProperty(Object.getPrototypeOf(t1), 'y', { value: 100 });
我发现 JavaScript 向对象添加属性的方式有所不同。下面的代码示例显示了它。
var t1 = {
x: 1
}
var t2 = {}
Object.defineProperty(t2, 'y', {
value: 2,
configurable: false,
writable: false
});
Object.setPrototypeOf(t1, t2);
t1.y = 100;
t1.y; --> returns 2
Object.defineProperty(t1, 'y', { value: 100 });
t1.y; --> return 100
t1 以 t2 为原型。我确保添加到 t2 的 属性 'y' 是不可配置且不可写的。当我尝试使用 t1.y = 100 将 y 添加到 t1 时,y 没有添加到对象中,t1.y 仍然是 return 2。但是,当使用 defineProperty 时,y 确实被添加到t1.
我认为这与 JavaScript 对待原型链的方式有关,但我无法理解它...
如果我们看一下 t1
和 t2
的样子,这会让这更容易理解..
在我们进行任何分配之前。
t1 = { x: 1 } -> proto { y: 2 }
t2 = { y: 2 }
现在我们尝试将 100 分配给 t1.y..
现在在 t1 的 defineProperty on 的原型上找到了 y,所以 100 被忽略,或者在严格模式下出错。
现在当我们在 t1 上定义 属性 时会发生什么。
t1 = { x: 1, y: 100 } -> proto { y: 2 }
t2 = { y: 2 }
IOW:您的 defineProperty 实际上应用于不同的对象,现在由于 属性 查找的工作方式,首先找到 y = 100
。如果您尝试在同一个对象上定义属性,如下所示,它将失败。
Object.defineProperty(Object.getPrototypeOf(t1), 'y', { value: 100 });