【发布时间】:2010-03-24 07:33:55
【问题描述】:
什么是 javascript 中的 expando 对象?
我们需要这个的目的是什么?任何完整的例子将不胜感激
我在这里找到了 1 篇文章 Javascript: The red-headed stepchild of web development
【问题讨论】:
标签: javascript expando
什么是 javascript 中的 expando 对象?
我们需要这个的目的是什么?任何完整的例子将不胜感激
我在这里找到了 1 篇文章 Javascript: The red-headed stepchild of web development
【问题讨论】:
标签: javascript expando
嗯,在 javascript 中,任何对象都是 expando 对象。正如文章所述,这意味着每当您尝试访问属性1时,它都会自动创建。
var myObj = {}; // completely empty object
myObj.myProp = 'value';
在您为myProp 赋值的那一刻,属性myProp 会动态创建,尽管它之前并不存在。在许多其他语言中,例如 C#,这通常是不可能的(实际上 C# 也刚刚启用了 expando 对象支持,但这不是重点)。要在 C# 中访问普通类中的属性,您需要在类中指定它确实具有该属性。
1 不太正确。请参阅下面 npup 的评论以进行澄清。
【讨论】:
foo.bar 并让undefined 回来并不能使foo 拥有属性bar。
除了原始类型(字符串、数字、布尔值)之外的所有内容都是对象并支持 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
【讨论】:
var i = new Number(3); i.someProperty = "someValue"; console.log(i.someProperty);
i 显式包装在 Number 对象中,这允许您使用 expando 属性。因此,这将不起作用:var i = 3; i.someProperty = "someValue"; console.log(i.someProperty);
i.toString() 是可能的。根据您使用它的上下文,它将表现为原语或对象。
ToObject 包装原语,但在计算表达式时它会立即丢弃包装器。您设置的任何属性都会被包装器丢弃。查看ECMAScript 262 standard 的第 8.7.1 节。
一篇写于 2007 年的文章,它使用 document.all(作为 only 访问元素的方式)?这是一个很大的危险信号。
它只是用一些流行语来修饰“您可以向对象添加属性”。
我们需要能够做到这一点,否则我们将无法存储数据,这将使 JavaScript 成为一种非常无用的语言。
(一切都是数组?不,它不是。它在没有 hasOwnProperty 包装器的情况下迭代一个对象。这不安全。远离文章,它比无用更糟糕)
【讨论】:
JavaScript 将具有特定名称 ID 的元素转换为返回的 DOM 对象的扩展。解释为here。
【讨论】: