是否有与Pythons getattr()函数等效的Javascript?
Javascript是否有等效的getattr()函数?或者我可以编写自己的函数吗?我真的不知道该去哪里。 Python代码:是否有与Pythons getattr()函数等效的Javascript?,javascript,python,Javascript,Python,Javascript是否有等效的getattr()函数?或者我可以编写自己的函数吗?我真的不知道该去哪里。 Python代码: method=getattr(self,方法名称) 方法() JS不需要函数,但您可以自己编写代码来模拟类似的行为 const obj={ 名称:“XYZ”, 经验:10, 组织:“谷歌” } 函数getattr(对象、属性、定义){ 返回obj中的道具?obj[道具]:def; } 常量值=getattr(对象,“名称”); console.log(值)JS不需要函
method=getattr(self,方法名称)
方法()
JS不需要函数,但您可以自己编写代码来模拟类似的行为
const obj={
名称:“XYZ”,
经验:10,
组织:“谷歌”
}
函数getattr(对象、属性、定义){
返回obj中的道具?obj[道具]:def;
}
常量值=getattr(对象,“名称”);
console.log(值)代码>JS不需要函数,但您可以自己编写代码来模拟类似的行为
const obj={
名称:“XYZ”,
经验:10,
组织:“谷歌”
}
函数getattr(对象、属性、定义){
返回obj中的道具?obj[道具]:def;
}
常量值=getattr(对象,“名称”);
console.log(值)代码>与Python不同,在Javascript中,对象属性(用点访问)和“项”(用方括号访问)之间没有区别
因此,在Javascript中,可以使用方括号间接访问属性,即
someObj.propName
及
做同样的事情,特别是
someObj.foo === someObj['foo']
这类似于getattr
所做的,但有几个注意事项需要记住:
首先,与getattr
不同,如果属性不存在,[]
将不会抛出。它只是默默地返回未定义的
其次,没有提供默认值的选项,因此如果需要,必须使用条件
value = propName in someObj ? someObj[propName] : defaultValue
第三,也是最重要的一点,适用于所讨论的属性是方法的情况。在python中,myObject.someMethod
或getattr(someObj,methodName)
将返回一个绑定函数,该函数知道自己的宿主对象,或self
。因此,您可以直接调用返回值:
class MyClass:
def __init__(self):
self.thing = 'hey'
def test(self):
print(self.thing)
myObject = MyClass()
methodName = 'test'
method = getattr(myObject, methodName)
method() # ok
在javascript中,myObject.someMethod
或someObj[methodName]
将返回一个未绑定的函数,该函数“不知道”它属于哪个对象。因此,如果您将其存储在变量中并稍后调用它,则这将不起作用:
class MyClass {
constructor() {
this.thing = 'hey'
}
test() {
console.log(this.thing);
}
}
myObject = new MyClass()
methodName = 'test'
method = myObject[methodName]
method() // NOT OK
必须显式“重新绑定”该方法才能调用它:
boundMethod = method.bind(myObject)
boundMethod() // ok
请注意,这仅适用于将方法存储在变量(或作为参数传递)中的情况。当您立即调用它时,一切都按预期进行:
myObject[methodName]() // ok
总而言之,python的getattr
的一个模糊模拟在Javascript中可能是这样的:
function getattr(obj, prop, defaultValue = null) {
if (prop in obj) {
let val = obj[prop];
if (typeof val === 'function')
return val.bind(obj);
return val;
}
if (arguments.length > 2) {
return defaultValue;
}
throw new TypeError(`"${obj}" object has no attribute "${prop}"`)
}
与Python不同,在Javascript中,对象属性(用点访问)和“项”(用方括号访问)之间没有区别
因此,在Javascript中,可以使用方括号间接访问属性,即
someObj.propName
及
做同样的事情,特别是
someObj.foo === someObj['foo']
这类似于getattr
所做的,但有几个注意事项需要记住:
首先,与getattr
不同,如果属性不存在,[]
将不会抛出。它只是默默地返回未定义的
其次,没有提供默认值的选项,因此如果需要,必须使用条件
value = propName in someObj ? someObj[propName] : defaultValue
第三,也是最重要的一点,适用于所讨论的属性是方法的情况。在python中,myObject.someMethod
或getattr(someObj,methodName)
将返回一个绑定函数,该函数知道自己的宿主对象,或self
。因此,您可以直接调用返回值:
class MyClass:
def __init__(self):
self.thing = 'hey'
def test(self):
print(self.thing)
myObject = MyClass()
methodName = 'test'
method = getattr(myObject, methodName)
method() # ok
在javascript中,myObject.someMethod
或someObj[methodName]
将返回一个未绑定的函数,该函数“不知道”它属于哪个对象。因此,如果您将其存储在变量中并稍后调用它,则这将不起作用:
class MyClass {
constructor() {
this.thing = 'hey'
}
test() {
console.log(this.thing);
}
}
myObject = new MyClass()
methodName = 'test'
method = myObject[methodName]
method() // NOT OK
必须显式“重新绑定”该方法才能调用它:
boundMethod = method.bind(myObject)
boundMethod() // ok
请注意,这仅适用于将方法存储在变量(或作为参数传递)中的情况。当您立即调用它时,一切都按预期进行:
myObject[methodName]() // ok
总而言之,python的getattr
的一个模糊模拟在Javascript中可能是这样的:
function getattr(obj, prop, defaultValue = null) {
if (prop in obj) {
let val = obj[prop];
if (typeof val === 'function')
return val.bind(obj);
return val;
}
if (arguments.length > 2) {
return defaultValue;
}
throw new TypeError(`"${obj}" object has no attribute "${prop}"`)
}
Javascript不需要函数来实现这一点-Javascript索引和点表示法是同一操作的两种语法,与Python不同。但是,与Python不同,Javascript确实需要一个函数来调用方法
。@georg:不,thing[name]()
已经做了正确的事情-特别是,它可以正确地绑定此
。你只需要确保你不会做像method=thing[name]这样的事情;method()
,它将丢失此
。Javascript不需要函数来实现此功能-Javascript索引和点表示法是同一操作的两个语法,与Python不同。但是,与Python不同,Javascript确实需要函数来调用方法
。@georg:No,thing[name]()
已经做了正确的事情-特别是,它正确地绑定了这个
。你只需要确保你不会做像method=thing[name]这样的事情;方法()。您应该在
中使用检查属性是否存在。var getattr=(obj,prop,def)=>obj中的prop?obj[prop]:def
可能更好当属性显式设置为null
或undefined
时,这样做是错误的。您应该在
中使用检查属性是否存在。var getattr=(obj,prop,def)=>obj中的prop?obj[prop]:def代码>可能更好