我正在寻找一种方法来修改由文字定义的对象,而不将其传递给另一个函数。
示例:
let o = {a:1,b:2}
console.log(o.a===3)
我认为,当我使用文字定义对象时,将调用Object构造函数,因此我确实覆盖了Object.prototype.constructor
,但只有在执行new Object({a:1,b:2})
时它才会被调用
更简单的问题是,任何人都可以做出a=3
而无需将对象o传递给函数或代理,也可以不使用o.a=3
或with
关键字,其中o
是使用对象文字?
答案 0 :(得分:2)
只需执行o.a=3;
和控制台日志o
:
let o = {a:1,b:2};
o.a=3;
console.log(o);
当前您正在执行o.a===3
,该操作将返回Boolean
的值,而不是覆盖属性a
的值。
您也无法在o.a=3
内进行console.log()
,因为o.a=3
将返回分配的值3
,但仍会更改{的属性a
{1}}至o
。
3
答案 1 :(得分:1)
根本不可能。
没有对象文字的构造函数。
您可以通过不同的方式创建对象:
YourPage.qml
另外,请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer
答案 2 :(得分:0)
更简单的问题是,任何人都可以在不将对象o传递给函数或代理的情况下做出a = 3吗?
o.a = 3;
我正在寻找一种方法来修改由文字定义的对象,而不将其传递给另一个函数。
那是不可能的,因为如果可能的话,您可能会破坏所有的javascript。那太可怕了。
哦,等等,这是JS ...
with({ get o() { return { a: 3 }; }, set o(v) {} }) {
o = {a:1,b:2};
console.log(o.a===3) // true
}
答案 3 :(得分:0)
如果o.a
拥有对变量a
的引用,那么您想要实现的目标就可以实现-不幸的是,该变量只能按照您想要的方式对被引用传递的变量进行操作< / em>。不过,String
,Number
和Boolean
之类的原始类型是通过值 传递的。
检查以下示例:
var a = 1;
var o = { a: a };
a = 2;
console.log(o.a, a);
使用new Number()
之类的Object构造函数也无济于事,因为它确实返回对对象的引用(根据需要通过引用传递),但是给它分配一个新值,读取该值仍会返回一个原语(再次由 value 传递):
var a = new Number(1);
var o = { a: a.valueOf() };
a = Number(2);
console.log(o.a, a);
如果您传递的内容自然是通过引用传递的,则您的期望会得到满足:
var a = [ 1 ]
var o = { a: a }
a[0] = 2
console.log(o.a[0])