Metody obiektu są ogólnie zadeklarowane i używane w ten sposób

points = { 
  first : function(){
    return this.val[0];
  }
};
points.val = [1,2];
points.first(); // returns 1

Ale dlaczego nie wolno mi używać zwrotów zwrotnych zamiast zadeklarowanej metody.

points.val = [1,2];
points.(function(){
    return this.val[0];
  })();
1
Sagi_Avinash_Varma 12 sierpień 2014, 12:34

3 odpowiedzi

Najlepsza odpowiedź

Możesz określić funkcję w punktach, które wymagają zwrotu pieniędzy

var points = {val:[1,2]};
points.func = function(callback){
    callback.call(this);
}

I zadzwoń do tego

points.func(function(){
    return this.val;
})

Nie możesz użyć funkcji jako klawisza obiektu, ale możesz dodać funkcję do obiektu. Możesz także zdefiniować funkcję poza obiektem i użyj metod .call lub .apply

function val(){
    return this.val;
}

val.call(points);
1
Gabs00 12 sierpień 2014, 11:03

Wywołanie metody na obiekcie składa się z dwóch kroków:

  1. Patrząc na właściwość obiektu według klucza
  2. Wykonanie zwracanej właściwości (która musi być funkcją lub podniesienie TypeError).

W pierwszym przykładzie kod dzwoniący używa składni ., aby pobrać właściwość points za pomocą klawisza first. Następnie wykonuje zwracaną właściwość, która jest anonimową funkcją.

W drugim przykładzie próbujesz spojrzeć na obiekt z kluczem:

(function(){
  return this.val[0];
})

W javascript, Klucze obiektowe muszą być ważnymi identyfikatorami. Funkcje nie są ważnymi identyfikatorami, więc Kompilator podnosi SyntaxError.

Jeśli próbujesz użyć dynamicznie zdefiniowanej funkcji, która używa this, aby odnieść się do points, używasz bind:

(function() { return this.val[0] }).bind(points)()
1
joews 12 sierpień 2014, 09:09

Myślę, co próbujesz zrobić, to zrobić Getter / Setter dla punktów.

points={};

// pass in an array to set points or pass a callback to retrieve them!
points.val = function (points){
//test if points is a callback return points to callback
if (typeof points==="function") return points(this._points); 
// or set the points with the passed in value
this._points=points;
};

//set the points
points.val([1,2])

//get points into callback

points.val(function(e){
    return e[0];
});
0
MartinWebb 12 sierpień 2014, 09:01