Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.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
是否有与Pythons getattr()函数等效的Javascript?_Javascript_Python - Fatal编程技术网

是否有与Pythons getattr()函数等效的Javascript?

是否有与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不需要函

Javascript是否有等效的getattr()函数?或者我可以编写自己的函数吗?我真的不知道该去哪里。 Python代码:

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可能更好