实现访问对象属性的函数与使用点表示法或括号表示法访问属性?

时间:2016-05-19 20:05:10

标签: javascript

回顾一些第三方代码,我找到了一个函数来获取对象的属性。

function getObjectProperty (obj, propertyName) {
        var o;
        if (obj) {
            o = obj[propertyName];
            if (o != null) {
                if (typeof o == 'function') return o();
            }
        }
        return o;
    }

调用此函数的示例如下:

var foo = getObjectProperty(r, 'objProp')

使用此自定义函数获取属性是否有一些好处,而不是仅仅执行此操作:

var foo = r.objProp

var foo = r['objProp']

我只是不明白使用此功能的好处,如果有的话?我找不到这个函数的另一个例子,所以我只能假设它是为这个应用程序定制的。我唯一能看到的是,如果object属性是一个函数,它会返回一个函数调用,但即使这样你也可以写:

var foo = r.objProp()

3 个答案:

答案 0 :(得分:0)

这看起来像一个(非常命名的)实用程序函数,正如您自己实现的那样,尝试从对象获取属性的值,但如果这是一个函数,则返回调用它的结果。

答案 1 :(得分:0)

代码中是不是很明显?

如果属性是函数,则该行调用:

   if (typeof o == 'function') return o();

虽然它没有得到属性,但功能并没有做到它应该做的事情。 getObjectPropertyButIfFunctionInvokeInstead()更合适的名称。

编写糟糕的代码

答案 2 :(得分:0)

简单的区别。如果给出一个像这样的对象:

var foo = { a: "a", b: function() { return "b" } }

然后foo.bfoo[b]会向getObjectProperty(foo,"b")

提供不同的结果

它似乎是一个实用功能来获得一个属性,如果它是一个" getter"功能,自动调用它。吸气剂是相当近期的,许多旧版浏览器不支持它们(IE直到9我才相信它们才能得到它们。)

当然,如果分配给b的函数返回了一个函数而不是一个值,那么它就不会打开,但可能并不是意图。

那么为什么这会有用呢?因为吸气剂很有用。想象一下,你有一个像这样的对象:

function order(quantity, price) {
    this.quantity = quantity;
    this.unitPrice = price;
    this.totalPrice = function() { return this.quantity * this.unitPrice }
};

var myOrder = new order(10,2);

如果我想查看myOrder的属性,那么我需要知道作为此对象的使用者totalPrice是一个函数。如果我改用getObjectProperty,那么我就不需要关心它了。 做正确的事并且我不需要担心它是如何计算的totalPrice