使用对象键在一行中声明和分配功能对象

时间:2014-08-02 18:19:30

标签: javascript

是否可以将以下内容压缩成一个声明?

var foo = function () { return; };
foo.bar = 'baz';

我最接近的是:

var foo = Object.create(function(){return;}, { bar : { value: 'baz' } });

但该功能不会运行。

2 个答案:

答案 0 :(得分:3)

您可以使用将属性从一个对象复制到另一个对象并返回已修改对象的函数来执行此操作。这是大多数通用JS库的一个特性,它通常被称为“扩展”。

Underscore

var foo =       _.extend( function () { return; }, { bar: 'baz' } );

jQuery

var foo =       $.extend( function () { return; }, { bar: 'baz' } );

Prototype

var foo =  Object.extend( function () { return; }, { bar: 'baz' } );

Angular

var foo = angular.extend( function () { return; }, { bar: 'baz' } );

Ext

var foo =      Ext.apply( function () { return; }, { bar: 'baz' } );

答案 1 :(得分:2)

非常简单:

var foo = Object.defineProperty(function() { }, 'bar', {value: 'baz'});

利用Object.defineProperty接受函数作为其第一个参数的事实,并返回该对象。

或者如果您碰巧有变量x

var foo = (x = function () { }, x.bar = 'baz', x);

荒谬的黑客攻击

我对这个问题的原始答案提出了以下内容,这可能被视为一个单一陈述":

var foo = (function() { var f = function () {} ; f.bar = 'baz'; return f; })();

或者,如果您考虑以下"单一陈述":

for (var foo=function() {}; !foo.bar; foo.bar = 'baz') { }

或者,本着@cookiemonster的精神:

var foo = (foo=function(){}) && (foo.bar = 'baz') && foo;