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