2016-05-19 5 views
0

Überprüfung einiger 3rd-Party-Code, ich habe eine Funktion gefunden, geschrieben, um eine Eigenschaft eines Objekts zu erhalten.Implementieren einer Funktion zum Zugreifen auf eine Objekteigenschaft im Gegensatz zum Zugriff auf die Eigenschaft mithilfe der Punktnotation oder Klammernnotation?

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

Ein Beispiel, wie diese Funktion aufgerufen wird, ist:

var foo = getObjectProperty(r, 'objProp') 

Gibt es einen Nutzen Sie diese benutzerdefinierte Funktion mit der Eigenschaft zu holen, anstatt nur, dies zu tun:

var foo = r.objProp 

oder

var foo = r['objProp'] 

Ich verstehe einfach nicht den Nutzen dieser Funktion, wenn es eine gibt? Ich konnte kein anderes Beispiel für diese Funktion finden, daher kann ich nur annehmen, dass es für diese Anwendung maßgeschneidert war. Das einzige, was ich sehen kann, ist, dass es einen Funktionsaufruf zurückgibt, wenn die Objekt-Eigenschaft eine Funktion ist, aber selbst dann könnte man einfach schreiben:

var foo = r.objProp() 
+0

Der Unterschied mit Ihrer Funktion berechnet ist, dass sie den Wert auspacken, wenn es eine Funktion ist (durch Aufruf) –

+0

Soweit ich kann sagen, du hast recht. Es vereinfacht nur das Abrufen von Werten aus Funktionen, wenn Sie die Funktion, die Syntax selbst aufruft, nicht verwenden möchten. Vielleicht wurde es geschrieben, bevor [getters] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) verfügbar war oder rückwärtskompatibel mit Browsern sein sollte, t unterstützen sie. –

+0

Danke für die Kommentare. Ich weiß, dass "Code-Erklärung" Fragen wie diese normalerweise nicht willkommen sind, aber ich konnte einfach nicht verstehen, warum das getan wurde. –

Antwort

0

Einfacher Unterschied. Wenn ein Objekt wie angegeben:

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

Dann foo.b oder foo[b] gibt ein anderes Ergebnis zu getObjectProperty(foo,"b")

Es scheint eine Nutzenfunktion zu sein, um eine Immobilie zu erhalten und wenn es ein „Getter“ -Funktion ist, wird es automatisch aufrufen . Getters sind ziemlich neu und viele ältere Browser unterstützen sie nicht (IE hat sie erst um 9 bekommen, glaube ich).

Natürlich, wenn die Funktion zugewiesen b eine Funktion anstelle eines Werts zurückgegeben, dann würde es nicht auspacken, aber das war vermutlich nicht die Absicht.

Also warum könnte das nützlich sein? Weil Getter nützlich sind. Stellen Sie sich ein Objekt wie folgt hatte:

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

var myOrder = new order(10,2); 

Wenn ich die Eigenschaften von myOrder aussehen wollen, dann muss ich wissen als Verbraucher dieses Objekts, dass totalPrice eine Funktion ist. Wenn ich stattdessen getObjectProperty verwende, muss ich mich nicht darum kümmern.Es wird das Richtige tun und ich brauche nicht zu befürchten, wie es totalPrice

+0

Vielleicht wurde es dann für Rückwärtskompatibilität geschrieben. Danke für die Antwort. –

0

Das sieht wie ein (schrecklich genannt) Nutzenfunktion, die, wie Sie realisierte sich selbst, versucht, den Wert der Eigenschaft aus dem Objekt zu erhalten, aber wenn das eine Funktion ist, gebe das Ergebnis des Aufrufs zurück.

+0

Also, wenn es ein Objekt gab, bei dem Sie nicht wussten, ob die Eigenschaften Funktionen waren oder nicht, könnten Sie diesen Code verwenden, um die Standardeigenschaft oder das Ergebnis des Aufrufs abzurufen? –

+0

@AlexChance - ja, aber der Name ist schrecklich. Es verrät nicht, was die Funktion wirklich macht. – Amit

+0

Ja, ich stimme zu. Und natürlich gibt es keine Kommentare, um die wahre Absicht des Codes zu erklären. –

0

Ist es nicht offensichtlich aus dem Code?

Diese Zeile ruft, wenn die Eigenschaft eine Funktion ist:

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

Obwohl es die Eigenschaft nicht erhalten und die Funktion nicht tut, was es soll zu. getObjectPropertyButIfFunctionInvokeInstead() passender Name.

Es ist schlecht geschrieben Code

+0

Von OP: "Das einzige, was ich sehen kann ist, dass es einen Funktionsaufruf zurückgibt, wenn die Objekteigenschaft eine Funktion ist", also denke ich, dass sie diesen Bonus kennen. Sie fragen, gibt es einen guten Grund für jemanden, dies zu schreiben. –

Verwandte Themen