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 扩展对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Javascript 中扩展对象

JavaScript原生对象及扩展

JavaScript之Date日期对象扩展

对象数量与有效负载,同时扩展现代 Javascript 项目哪个更重要?

数据对象扩展闰年javascript [重复]

在 javascript 中扩展 Array 对象的方法