使用DefineProperty在原型链中添加属性

时间:2018-08-01 11:48:49

标签: javascript prototype defineproperty

我发现JavaScript向对象添加属性的方式有所不同。下面的代码示例显示了它。

churn_per_tenure['Churn_Rate'] = churn_per_tenure['Churned'] / churn_per_tenure['count']
print (churn_per_tenure)
   Tenure  Churned  count  Churn_Rate
0       1        2      3    0.666667
1       2        1      3    0.333333
2       3        0      1    0.000000

t1以t2为原型。我确保添加到t2的属性“ y”是不可配置且不可写的。当我尝试通过使用t1.y = 100将y添加到t1时,y不会添加到对象中,并且t1.y仍然返回2。但是,当使用defineProperty时,y确实会添加到t1。

我认为这与JavaScript如何处理原型链有关,但是我无法将其包裹住...

1 个答案:

答案 0 :(得分:0)

如果我们看看t1t2的样子,这将使它更容易理解。

在进行任何分配之前。

t1 = { x: 1 } -> proto { y: 2 }
t2 = { y: 2 }

现在我们尝试将100分配给t1.y ..
现在,在t1的具有defineProperty的原型上可以找到y,因此将忽略100或在严格模式下出错。

现在,当我们在t1上定义属性时会发生什么。

t1 = { x: 1, y: 100 } -> proto { y: 2 }
t2 = { y: 2 }

IOW:您的defineProperty实际上已应用于其他对象,现在由于属性查找的工作方式,首先找到y = 100。如果您尝试在同一对象上定义Property,如下所示,它将失败。

Object.defineProperty(Object.getPrototypeOf(t1), 'y', { value: 100 });