我发现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如何处理原型链有关,但是我无法将其包裹住...
答案 0 :(得分:0)
如果我们看看t1
和t2
的样子,这将使它更容易理解。
在进行任何分配之前。
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 });