在“只是好奇”或“有可能吗?”的情况下将此文件归档。
比如我说......
home: function(options) {
this._home('home', options)
}
login: function(options) {
this._home('login', options)
}
home
和login
显然是许多对象属性的标识符,用于跟踪目的。有没有办法只返回home
或login
而不使用任何变量(外部函数调用没问题)?
更新:原来这是不可能的。接受的答案并没有完全回答这个问题,但它是简化对同一财产的大量调用的一个很好的例子。
答案 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 。