如何确定是否可以将新字段添加到预先存在的对象中?

时间:2017-07-25 15:30:25

标签: javascript object

我是C/Python家伙,转移到Javascript'最近。

基本上,我在函数中接收一个对象(名为context)作为参数。调用函数的定义对我来说是隐藏的。现在我需要在type中添加一个字段(context)。当我直接向上下文添加type时,它并未反映上下文中的更改。但是,当我尝试修改“上下文”现有字段之一的值时,会反映出此更改。

然后我再创建一个对象(new_obj)并复制' context'在' new_object'中,然后尝试在' new_object'中添加该字段,但不成功。所以从这个行为来看,我猜这个值没有复制,但参考是。

所以最后我需要在new_obj中逐字段复制,然后添加新字段'输入'。此外,如果我创建一个本地对象,则会添加新字段并修改对象结构。

到目前为止一切顺利。但我想知道'背景'的实施情况。对象在后台调用函数中。我的意思是,如果有一些' const'在这里输入东西(如在C中,(随机思想:P)),然后在它应用的级别,即只有添加新字段或改变现有字段值的限制。需要对这个问题有所了解。

1 个答案:

答案 0 :(得分:2)

  

但我想知道后台调用函数中'context'对象的实现。我的意思是如果这里有一些'const'类型的东西(如在C中,(随机思想:P)),那么它在什么级别应用它,即只有添加新字段或改变现有字段值的限制。需要对这个问题有所了解。

部分取决于对象是主机提供的对象(例如,来自浏览器或类似对象),还是真正的JavaScript对象。

主机提供的对象几乎可以做任何想做的事情。 : - )

真正的JavaScript对象可以通过Object.seal“密封”。这会阻止向其添加新属性,但不会阻止对现有属性的更改 - 与context的描述完全匹配。这是一个例子:

var o = Object.seal({
  answer: 0
});
console.log(o.answer);   // 0
o.answer = 42;
console.log(o.answer);   // 42
o.question = "Life, the Universe, and Everything";
console.log(o.question); // undefined

如果您使用strict mode,尝试在密封对象上创建属性是一个方便的错误:

"use strict";
var o = Object.seal({
  answer: 0
});
console.log(o.answer);   // 0
o.answer = 42;
console.log(o.answer);   // 42
o.question = "Life, the Universe, and Everything"; // Throws error
console.log(o.question); // (we don't get here)