2012-08-01 88 views
1

在“只是好奇”或“是否有可能?Javascript:获取对象字符串中当前对象属性的名称

比方说我有...

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

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

homelogin显然标识符几十个对象的属性进行跟踪。有没有办法只是返回homelogin而不使用任何变量(外部函数调用罚款)的对象属性?

更新:原来这是不可能的。接受的答案并不完全回答这个问题,但它是简化对同一财产的众多呼叫的一个很好的例子。

回答

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属性设置为某个其他值(只要其他引用继续存在),该函数也将继续存在。

+0

Ooops,你不能动态设置这样的对象属性。 'home:callHome('home')'抛出一个typeError(试图调用不是函数的东西),因为没有'_home'属性。 – RobG 2012-08-01 06:03:43

+0

@RobG - 我认为OP会提供'_home'属性,因为它没有在问题中显示,但在我的jsfiddle演示中,我确实提供了一个样本'_home'。话虽如此,实际上你在创建对象时不会出错 - 在对象文本中使用'home:callHome('home')'没有问题,因为'callHome()'不使用缺少的'_home '属性,它返回使用'_home'的另一个函数。如果你试图说'someObj.home()',那么你只会在稍后遇到问题,并且此时还没有'_home'函数。 – nnnnnn 2012-08-01 06:05:55

+0

是的,当您尝试调用它时发生错误。 – RobG 2012-08-01 06:14:48

1

标识符解析和对象属性查找使用完全独立的方法。您可以使用将一个对象添加到作用域链的顶部,但这是非常推荐的对象,完全可能在严格模式下完全失败。

所以,如果您有:

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

然后标识测试是在作用域链解决。由于它不存在,所以会引发错误。然而,用于:

alert(obj.test); 

然后首先OBJ被解析,结果发现作为参考到一个对象,则所述标识符测试解析为对象的属性。您还可以使用

在这种情况下
with (obj) { 
    alert(test); 
} 

OBJ被暂时放置在范围链的顶端,因此测试上它首先解决了。

相关问题