簡體   English   中英

實現一個函數來訪問對象的屬性,而不是使用點符號或方括號符號來訪問屬性?

[英]Implementing a function to access an object's property versus accessing the property using dot notation, or bracket notation?

回顧一些第三方代碼,我發現編寫了一個函數來獲取對象的屬性。

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()

這看起來像一個(非常命名的)實用程序函數,正如您意識到的那樣,它嘗試從對象中獲取屬性的值,但是如果這是一個函數,則返回調用它的結果。

從代碼中不明顯嗎?

如果屬性是一個函數,則此行調用:

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

盡管它沒有獲得屬性,並且函數沒有執行應有的功能。 getObjectPropertyButIfFunctionInvokeInstead()更合適的名稱。

這是寫得不好的代碼

簡單的區別。 如果給定像這樣的對象:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM