Mam więc klasę, zadzwoń do tego A. Dla tej klasy napisałem kilka funkcji, które mogę zadzwonić:

var a = new A();
a.getSomething();
a.putSomething();
a.delSomething();

I tak dalej. Teraz pomyślałem, że to trochę się zorganizowałem, więc nie stałoby się zbyt zaśmiecone i wyglądałoby jak trochę więcej:

a.something.get();
a.something.put();
a.something.del();

I tak próbowałem to osiągnąć:

A.prototype.something = {
  get: function(){...},
  put: function(){...},
  del: function(){...}
};

Ale te funkcje (Get, Put i Del) nadal muszą uzyskać dostęp do wspólnych obiektów / funkcji znalezionych w A, więc potrzebuję odniesienia do A, ale nie wiem, jak można to osiągnąć.

Jedna opcja, którą znalazłem, dzieje się tak:

A.prototype.something = function(){
  var that = this;
  return {
    get: function(){...},
    ...
  };
}; 

I "że" byłoby użyty w funkcjach (Get, Put i Del), zamiast "tego". Ale to oznaczałoby, że będę musiał zadzwonić do tych funkcji w taki sposób:

a.something().get();
...

Który nie wydaje mi się bardzo miły. Czy więc istnieje sposób, w jaki mogłem zorganizować te rzeczy tak, jak pierwotnie planowałem?

11
Deiwin 30 sierpień 2012, 04:12

3 odpowiedzi

Najlepsza odpowiedź

Więc mam klasę

JavaScript nie ma zajęć. Posiada dziedziczenie prototypu, które mogą emulować zajęcia w ograniczonym zakresie, ale to nie jest warte wyłącznie ze względu na zajęcia emulacyjne. Dużo lepsze jest optymalne wykorzystanie wbudowanych funkcji językowych, a nie próbowania, aby JavaScript naśladuje inny język.

Więc masz konstruktor ...

Napisałem kilka funkcji, które mogę zadzwonić do tego:

var a = new A();
a.getSomething();
a.putSomething();
a.delSomething();

Przypuszczalnie te metody są na a.prototype.

I tak dalej. Teraz pomyślałem, że to trochę się zorganizowałem, więc nie stałoby się zbyt zaśmiecone i wyglądałoby jak trochę więcej:

a.something.get();
a.something.put();
a.something.del();

To nie jest mniej zaśmiecone (dla mnie). Myślę, że istnieje jakaś wspólna rzecz, która odbywa się przez coś , i że jego otrzymasz , put itp. Metody Chcesz działać na > A nie na coś .

Wartość to jest ustawiona przez połączenie, nie ma innego sposobu ustawienia jego wartości innej niż w przypadku wiązania ES5. Więc metoda nazywana musi mieć dostęp do A jakoś. Inne odpowiedzi pokazują, jak to zrobić z zamknięciem, ale konsekwencją jest to, że każda instancja musi mieć własne coś obiekt i dołączone metody.

Poniżej przedstawiono podobne, ale pozbywa się zamknięcia i umieszcza metody na Something.prototype za trochę wydajności:

function A(name) {
    this.name = name;
    this.something = new Something(this);
}


function Something(that){
    this.that = that;
}

Something.prototype.get = function() {
    return this.that.name;
}
Something.prototype.put = function(prop, value) {
    this.that[prop] = value;
}

var a = new A('a');

alert(a.something.get());     // a
a.something.put('name', 'z');
alert(a.something.get());     // z

Możesz więc mieć wiele rzeczy , każdy z innym put , get itp. Ale interweniowanie coś jest naprawdę tylko urządzeniem, które wykorzystuje więcej pamięci (prawdopodobnie niewielkiej ilości) i wymaga dodatkowego charakteru. Prostsze, aby zachować metody coś o A.prototype i nie muszą wpisywać dodatkowej kropki (.).

4
Eric 30 sierpień 2012, 20:59

Nie można dodać tego do prototypu, ponieważ członek something nie jest taki sam na wszystkich obiektach - wewnętrznie, jego metody muszą uzyskać zamknięcie obiektu zewnętrznego, co nie jest możliwe w momencie wykonania .

Musisz to zrobić w konstruktorze:

function A() {
    var that = this;
    this.something = { 
       get: function(){...}, 
       ... 
    };
}
6
Eric 30 sierpień 2012, 00:30
function A() {
  this.something = this;
}
A.prototype = {
  get: function(){...},
  put: function(){...},
  del: function(){...}
};

W związku z tym:

a.something.get();
a.something.put();
a.something.del();
0
Kernel James 3 wrzesień 2012, 09:43