Javascript:获取Object Literal中当前对象属性的名称

时间:2012-08-01 05:30:55

标签: javascript

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

比如我说......

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

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

homelogin显然是许多对象属性的标识符,用于跟踪目的。有没有办法只返回homelogin而不使用任何变量(外部函数调用没问题)?

更新:原来这是不可能的。接受的答案并没有完全回答这个问题,但它是简化对同一财产的大量调用的一个很好的例子。

2 个答案:

答案 0 :(得分: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属性设置为某个其他值(只要其他引用继续存在),该函数仍将继续存在

答案 1 :(得分:1)

标识符分辨率和对象属性查找使用完全独立的方法。您可以使用 with 将对象添加到作用域链的顶部,但是建议不要使用它,并且可能在严格模式下完全失败。

所以如果你有:

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

然后在范围链上解析标识符 test 。由于它不存在,因此会引发错误。但是,对于:

alert(obj.test);

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

with (obj) {
  alert(test);
} 

在这种情况下, obj 暂时放在范围链的顶部,因此首先解析 test