Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:获取对象文字中当前对象属性的名称_Javascript - Fatal编程技术网

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”,而无需硬编码,那么就我所知,这是不可能的。”-这正是我想要的。话虽如此,你的回答对其他人来说是一个很好的帮助,我会接受这个问题的更新。谢谢你的帮助。哦,你不能像那样动态设置对象属性<代码>主页:呼叫主页(“主页”)