对象文字构造函数

时间:2018-09-15 09:05:18

标签: javascript object prototype object-literal

我正在寻找一种方法来修改由文字定义的对象,而不将其传递给另一个函数。

示例:

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=3with关键字,其中o是使用对象文字?

4 个答案:

答案 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>。不过,StringNumberBoolean之类的原始类型是通过值 传递的。

检查以下示例:

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])