Javascript:获取对象文字中当前对象属性的名称
将此文件归档在“只是好奇”或“可能吗?” 比如说我有Javascript:获取对象文字中当前对象属性的名称,javascript,Javascript,将此文件归档在“只是好奇”或“可能吗?” 比如说我有 home: function(options) { this._home('home', options) } login: function(options) { this._home('login', options) } home和login显然是几十个对象属性上的标识符,用于跟踪。有没有一种方法可以直接返回主页或登录,而不使用对象属性中的任何变量(可以使用外部函数调用) 更新:结果表明这是不可能的。接受的答案并不能完
home: function(options) {
this._home('home', options)
}
login: function(options) {
this._home('login', options)
}
home
和login
显然是几十个对象属性上的标识符,用于跟踪。有没有一种方法可以直接返回主页
或登录
,而不使用对象属性中的任何变量(可以使用外部函数调用)
更新:结果表明这是不可能的。接受的答案并不能完全回答这个问题,但它是一个很好的例子,可以简化对同一属性的多次调用。如果您的意思是在
home
属性引用的函数中,您希望能够以某种方式从该属性名称中获取字符串“home”
,而无需对其进行硬编码,则不,就我所知那是不可能的
仅仅是猜测一下你想要实现的目标,像这样的事情至少会有一点帮助:
function callHome(propName) {
return function(options) {
this._home(propName, options);
}
}
var someObj = {
home: callHome('home'),
login: callHome('login')
}
someObj.home({some:"option"});
至少,您不必为每个属性重复相同的函数体。演示:
注意:我假设问题中调用但未定义的\u 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
属性设置为其他值,该函数也将继续存在(只要其他引用继续存在).如果您的意思是,在home
属性引用的函数中,您希望能够以某种方式从该属性名称中获取字符串“home”
,而无需对其进行硬编码,那么就我所知,这是不可能的
仅仅是猜测一下你想要实现的目标,像这样的事情至少会有一点帮助:
function callHome(propName) {
return function(options) {
this._home(propName, options);
}
}
var someObj = {
home: callHome('home'),
login: callHome('login')
}
someObj.home({some:"option"});
至少,您不必为每个属性重复相同的函数体。演示:
注意:我假设问题中调用但未定义的\u 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
属性设置为其他值(只要其他引用继续存在),该函数也将继续存在。标识符解析和对象属性查找使用完全不同的方法。您可以使用with将对象添加到范围链的顶部,但强烈建议不要使用,并且在严格模式下可能会完全失败
因此,如果你有:
var obj = {test:'test'};
alert(test);
然后在范围链上解析标识符测试。因为它不存在,所以会抛出一个错误。但是,对于:
alert(obj.test);
然后首先解析obj并将其作为对象的引用,然后将标识符测试解析为对象的属性。您还可以与以下一起使用:
在这种情况下,obj临时放置在作用域链的顶部,因此首先在其上解析测试。标识符解析和对象属性查找使用完全不同的方法。您可以使用with将对象添加到范围链的顶部,但强烈建议不要使用,并且在严格模式下可能会完全失败 因此,如果你有:
var obj = {test:'test'};
alert(test);
然后在范围链上解析标识符测试。因为它不存在,所以会抛出一个错误。但是,对于:
alert(obj.test);
然后首先解析obj并将其作为对象的引用,然后将标识符测试解析为对象的属性。您还可以与以下一起使用:
在这种情况下,obj临时放置在作用域链的顶部,因此测试首先在其上解决。Ooops,您不能像这样动态设置对象属性
home:callHome('home')
抛出一个类型错误(试图调用非函数的东西),因为没有\u home
属性。@RobG-我假设OP会提供\u home
属性,因为它没有在问题中显示,但在我的jsfiddle演示中,我确实提供了一个\u home
示例。话虽如此,实际上在创建对象时不会出现错误-对象文本中的home:callHome('home')
没有问题,因为callHome()
不使用缺少的\u home
属性,它返回另一个使用\u home
的函数。只有当您稍后试图说someObj.home()
时,您才会遇到问题,而此时仍然没有\u home
函数。@RobG-我不确定您最后的评论是指调用callHome()
还是home()
-我将假设后者,因为这意味着您同意我的看法。无论哪种方式,我都在答案中添加了一条注释,指出需要定义\u home()
。@nnnnnn感谢您提供详细的答案<代码>\u home被定义为另一个属性。我们使用主干网,所以它的设置是这样的。您的第一句话:“如果您的意思是,在home属性引用的函数中,您希望能够以某种方式从该属性名称中获取字符串“home”,而无需硬编码,那么就我所知,这是不可能的。”-这正是我想要的。话虽如此,你的回答对其他人来说是一个很好的帮助,我会接受这个问题的更新。谢谢你的帮助。哦,你不能像那样动态设置对象属性<代码>主页:呼叫主页(“主页”)