1

将此文件归档在“只是好奇”或“有可能吗?”下。

比如说我有...

home: function(options) {
   this._home('home', options)
}

login: function(options) {
    this._home('login', options)
}

home并且login显然是用于跟踪目的的数十个对象属性的标识符。有没有办法在对象属性中只返回homelogin不使用任何变量(外部函数调用很好)?

更新:事实证明这是不可能的。接受的答案并不能完全回答问题,但它是简化对同一属性的多次调用的一个很好的例子。

4

2 回答 2

3

如果您的意思是在home属性引用的函数中,您希望能够以某种方式"home"从该属性名称中获取字符串而无需对其进行硬编码,那么不,据我所知,这是不可能的。

只是猜测您要达到的目标,这样的事情至少会有所帮助:

function callHome(propName) {
   return function(options) {
      this._home(propName, options);
   }
}

var someObj = {
   home: callHome('home'),
   login: callHome('login')
}
someObj.home({some:"option"});

至少你不必为每个属性重复相同的函数体。演示:http: //jsfiddle.net/EeEAw/

注意:我假设_home()问题中调用但未定义的函数将在实际代码中的某处定义。我没有在我的答案中显示它,尽管我在我的小提琴中创建了一个虚拟的。

顺便说一句,请注意该函数并不真正“属于”对象或属性 - 没有什么能阻止你做这种事情:

var obj = {
   test : "test",
   home : function() {
      alert(this.test);
   }
};
var funcRef = obj.home;
var obj2 = {
   method1 : funcRef
}
obj.home = null;
funcRef();
obj2.method1();

也就是说,您可以创建对同一个函数的多个引用,即使原始obj.home属性设置为其他值,该函数仍将继续存在(只要附加引用继续存在)。

于 2012-08-01T05:38:56.393 回答
1

标识符解析和对象属性查找使用完全独立的方法。您可以使用with将对象添加到作用域链的顶部,但强烈建议不要这样做,并且在严格模式下很可能会完全失败。

因此,如果您有:

var obj = {test:'test'};
alert(test);

然后在作用域链上解析标识符测试。由于它在那里不存在,因此会引发错误。但是,对于:

alert(obj.test);

然后首先解析obj并找到对对象的引用,然后将标识符test解析为对象的属性。您还可以使用

with (obj) {
  alert(test);
} 

在这种情况下,obj临时放置在作用域链的顶部,因此首先在其上解析测试。

于 2012-08-01T05:55:25.200 回答