我可以在对象文字中使用别名吗?

时间:2011-11-17 18:07:55

标签: javascript-objects javascript

  

可能重复:
  Self-references in object literal declarations

我有一个对象文字,用作配置元素并查找密钥。

customRendering:{
                  key1: func(){....},
                  key2: func(){....}
}

我的情况是key2key3可以使用相同的功能。有没有办法为key2key3分配相同的函数,而不必在对象文字之外声明函数而不必声明额外的键?

我希望我可以做类似的事情:

key2: key3: func(){....}

4 个答案:

答案 0 :(得分:10)

一种安全的方式:

我不知道我之前在想什么。如果你使用更详细的“文字”,你可以实例化一个自定义函数:

o = new function () {
  this.foo = function () { console.log('works'); };
  this.bar = this.foo;
};

这是一个肮脏讨厌的黑客:

在设置对象时, 可以使用临时变量来存储对函数的引用。小心使用闭包并在使用之前调用var,这样就不会污染全局命名空间:

(function () {
  var o, baz;
  o = {
    foo: baz = function () {console.log('works')},
    bar: baz
  }
  //more code
}());

我称这是一个肮脏讨厌的黑客的原因是它使代码不易读取,更难判断检查此代码(特别是如果对象文字声明更长) where {{ 1}}已设置。

最好只在对象文字外部编写别名,以便明确显示它是别名。

注意:指定的函数格式不起作用

baz

在对象文字中无法使用共享引用定义别名。

可以使用别名功能,但它不会是一个相同的参考:

o = { //THIS WON'T WORK
  foo: function baz() {/* code */},
  bar: baz
}

共享引用的典型方法是在对象文字之后,这听起来像你想要避免的那样:

o = {
  foo: function...
  bar: function () { return this.foo() } //even better if you use `apply` or `call`
}

或者,正如您在问题中指出的那样(并且为了完整性),您可以在对象文字之外定义函数:

o = {
  foo: function...
}
o.bar = o.foo;

响应@Peter关于从函数返回对象

使用自动执行的匿名函数另一种实例化内联对象的方式,并且会使整个问题变得毫无疑问:

func = function () {/* code */};
o = {
  foo: func,
  bar: func
}

或者像这样:

o = (function () {
  var o = {
    foo: function () {/*code*/}
  }
  o.bar = o.foo;
  return o;
}());

答案 1 :(得分:1)

  

无需在对象文字

之外声明该函数

我认为这部分使它变得不可能。然而,虽然我一直使用JavaScript,但我不是专业的JS忍者,所以也许我错了。

我将如何做到这一点的代码(虽然看起来你已经知道你可以做到这一点,但我认为最好还是这样说):

customRendering = {};
customRendering.key1 = func(){....};
customRendering.key2 = customRendering.key1;

答案 2 :(得分:-1)

定义除对象之外的函数:

var func = function() { ... };
...
  customRendering: {
    key1: func,
    key2: func
  }

答案 3 :(得分:-2)

抱歉,我理解你的问题不正确。

这是一个可能的解决方案:

    var obj = {
      func1: function() {},
      func2: obj.func1
    }