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 参数,但是当您省略ab 时,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 中的对象说明符的主要内容,如果未能解决你的问题,请参考以下文章

翻译JavaScript 中的函数式编程:函数组合与柯里化

使用 evaluateJavaScript(..) 调用 javascript 函数,以读取应用程序包中的文本文件

JavaScript 浏览器程序设计

面向对象的JavaScript --- 封装

javascript高级教程JavaScript Number 对象

javascript高级教程JavaScript Number 对象