Javascript expando对象

xyz*_*xyz 49 javascript expando

什么是javascripts中的expando对象?

出于什么目的我们需要这个?任何完整的例子将不胜感激

我在这里找到了1篇文章Javascript:Web开发的红头发的继子

Dav*_*und 41

好吧,在javascript中,任何对象都是一个expando对象.这意味着,正如文章所述,每当您尝试访问属性1时,它将自动创建.

var myObj = {}; // completely empty object
myObj.myProp = 'value';
Run Code Online (Sandbox Code Playgroud)

分配myProp值时,属性myProp是动态创建的,尽管之前不存在.在许多其他语言中,例如C#,这通常是不可能的(实际上C#也刚刚启用了expando对象支持,但除此之外).要在C#中访问普通类中的属性,您需要在类中指定它确实具有此属性.

1不太正确.请参阅下面的npup评论以获得澄清.

  • 不..如果你只是"试图访问"一个属性,它当然不会"自动创建".你可以随时随地推动房产,但这并不是一回事.只是伸出不存在的`foo.bar`并获得`undefined`不会使`foo`*拥有*属性`bar`. (50认同)
  • 因此,总结一下:expando功能是*write*,而不是access.Javascript对象允许您将新属性写入对象,而无需预定义该属性,这在某些其他语言中是必需的. (5认同)

Abh*_*jit 10

除了原始类型(字符串,数字,布尔值)之外的所有内容都是对象并支持Key:values结构.可以使用点表示法和方括号访问和设置属性(键).

var myObj = {};   
myObj.myProp1 = 'value1'; //works, an expando property   
myObj[myProp2] = 'value2'; // doesn't work, myProp2 is an undefined name.
myObj['myProp2'] = 'value2'; // works  , an expando property   
myObj[2010]= 'value'; //note the key is number, still works, an expando property??   
myObj.2010 = 'value'; // FAILS. to use dot notation, key must be a string
Run Code Online (Sandbox Code Playgroud)

  • @Sprog:我不清楚.JavaScript*在必要时使用内部`ToObject`来包装原语,但是一旦表达式被计算,它就会丢弃包装器.您设置的任何属性都将与包装器一起丢弃.查看[ECMAScript 262标准]的第8.7.1节(http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf). (3认同)
  • 甚至原始类型在必要时自动包装到对象中.`var i = new Number(3); i.someProperty ="someValue"; 的console.log(i.someProperty);` (2认同)
  • @igor:"自动"是错误的词,有点误导.您在Number对象中明确地包装了`i`,它允许您使用expando属性.因此,这不起作用:`var i = 3; i.someProperty ="someValue"; 的console.log(i.someProperty);` (2认同)