Javascript 中的对象说明符
Posted
技术标签:
【中文标题】Javascript 中的对象说明符【英文标题】:Object Specifiers in Javascript 【发布时间】:2012-10-31 17:36:42 【问题描述】:在 Douglas Crockford 的书“javascript: The Good Parts”中,他在将值传递给新对象时提到了对象说明符。本质上,与其按特定顺序将参数传递给函数,他建议传递一个包含参数的对象,如下所示:
var myObject = someFunction(a: 1, b: 2, c: 3);
然而,没有解释的是如何在这些参数被传递之后处理它们。而不是执行以下操作来设置默认值:
function someFunction(params)
this.a = params.a || 0;
this.b = params.b || 0;
...
还有什么方法可以处理大量参数而又不那么冗长?
编辑:看看下面的答案,使用 for-in 循环是一个不错的选择。在为每个属性设置不同的默认值时,还有什么方法可以做到这一点?有没有办法创建一个具有各种默认值的对象并与之进行比较?
【问题讨论】:
您可以有一个“标准”对象,您可以在某种循环中将输入与该对象进行比较。 jQuery-plugins 通常处理这个的方式(虽然这是使用 jQuery)也可能很有趣:docs.jquery.com/Plugins/Authoring#Defaults_and_Options 请注意,逐个执行参数可以让您单独指定默认值(m90 建议的默认对象也允许这样做),或者在未提供某些参数时采取特殊措施。 m90 & nnnnnn:如果您想说明答案,我已经更新了我的问题以说明不同的默认值。 【参考方案1】:通常使用defaults
对象完成,如果参数中不存在属性,您可以从中复制属性。该对象可能是私有的或可供公众配置。
var defaults = a:null, b:1, ...;
function someFunction(params)
for (var prop in defaults)
if (prop in params)
this[prop] = params[prop];
else
this[prop] = defaults[prop];
或
function someFunction(custom)
var params = a:null, b:1, ...;
for (var prop in custom)
params[prop] = custom[prop];
// now use params
有时,传递给函数的 custom/params
对象本身也会被扩展,但是在文档中应该明确提到该对象可以被修改:
var defaults = a:null, b:1, ...;
function someFunction(params)
// modifies params object!
for (var prop in defaults)
if (! (prop in params))
params[prop] = defaults[prop];
// now use params
如果您正在使用带有extend
函数的库,您通常可以将此初始化缩短为
var params = $.extend(, defaults, custom);
// create an empty object, copy the defaults, and overwrite with custom properties
【讨论】:
这绝对是我的问题最干净的解决方案。这正是我想要的。【参考方案2】:如何使用 for-in 循环
function someFunction(params)
for(var key in params)
if( params.hasOwnProperty(key)
var def = null;
if(key == 'a' || key == 'b')
def = 10;
if(key == 'c' || key == 'd')
def = undefined;
this[key] = params[key] || def ;
【讨论】:
Noticeed ;) 虽然有一点,但我认为指出这只会制作浅拷贝是恰当的。但这实际上可能是需要的。 这是对我最初问题的一个很好的回答。如果您愿意对其进行编辑以考虑不同的默认值,我将不胜感激。 @sprawl .. 不同的默认值是什么意思?? 这个功能绝对不行。它枚举给定的params
参数,但是当您省略a
或b
时,null
也不会用作默认值。
@Sushanth-- 你在哪里将它设置为 null,如果你想根据默认值的对象将它设置为不同的值怎么办?例如,如果没有输入任何内容,您希望 this.a 等于 10,并且您希望 this.b 等于 7,或者类似的东西。【参考方案3】:
遍历作为参数传递的对象中的字段,将每个字段创建为 this 对象上的字段。
function someFunction(params)
for(x in params)
this[x] = params[x];
工作示例:http://jsfiddle.net/59kzD/
【讨论】:
【参考方案4】:Bergi 的扩展答案:
var params = $.extend(, defaults, custom);
我们现在可以在 ES6 中使用 Object.assign(, defaults, custom)
而无需任何库。
【讨论】:
以上是关于Javascript 中的对象说明符的主要内容,如果未能解决你的问题,请参考以下文章
使用 evaluateJavaScript(..) 调用 javascript 函数,以读取应用程序包中的文本文件