2014-05-25 18 views
11

Oto mój obiekt javascript, chciałbym wiedzieć, jak unikać tego "wiele razy" w prototypie. Wiem, że istnieje wiele teorii i powiązań dla prototypowego dziedziczenia i na to prawdopodobnie już udzielono odpowiedzi, ale ponieważ nie byłem w stanie sprostać wszystkim celom końcowym, pomyślałem, że może to być warte innego pytania.Jak uniknąć używania "tego" w prototypach JavaScript

function shape(smth) { 
    this.a = smth 
    this.b = 2 
    this.c = 3 
} 

shape.prototype.doCalculus = function() { 
    return this.a * this.b + this.c - (2 * (this.b + this.c) + this.a); 
} 

module.exports = shape 
+0

Nie ma niejawny sposób odnosić się do właściwości obiektu kontekstowego. Najlepsze, co możesz zrobić, to wypowiedź 'with', ale ma ona wiele problemów i najlepiej jej unikać. – Pointy

+5

Jeśli chcesz publicznych członków obiektu, muszą one być odniesione ze wskaźnika "ten". Tak działa OO w JavaScript. Nie ma alternatywy. Jeśli masz dużo odwołań do tej samej zmiennej w funkcji, możesz tymczasowo umieścić ją w zmiennej lokalnej tylko po to, aby zapisać pewną logikę odniesienia. – jfriend00

+0

@ jfriend00, chętnie zaakceptuję to jako odpowiedź :) – user14742

Odpowiedz

6

Jeśli chcesz członków publiczne obiektu, muszą się odwoływać od wskaźnika this. Tak działa OO w JavaScript. Nie ma alternatywy.

Jeśli masz dużo odwołań do tej samej zmiennej w funkcji, możesz tymczasowo umieścić ją w zmiennej lokalnej tylko po to, aby zapisać logikę odniesienia (tak jak w przypadku każdego odniesienia do wielu kroków), ale nadal będziesz musiał początkowo pobierz przy użyciu this.varName.


Nie

to program, który wykorzystuje „prywatny” zmienne w zamknięciu konstruktora i nie używa prototyp, który może być wykorzystywany w niektórych sytuacjach, a to pozwala odnieść się do zmiennych bezpośrednio bez tego wykorzystania this :

function shape(smth) { 
    var a = smth, 
     b = 2, 
     c = 3; 

    this.doCalculus = function() { 
     return a * b + c - (2 * (b + c) + a); 
    } 
} 

module.exports = shape 

dla typów obiektów, gdzie tworzą wiele przypadków, może to spożywać nieco więcej pamięci, ponieważ metody nie są przechowywane na wspólnej prototyp, ale tworzone są oddzielnie dla każdej instancji. Są tacy, którzy twierdzą, że różnica w zużyciu pamięci jest nieistotna w większości zastosowań.

2

Można uniknąć this takiego:

function Shape(smth) { 
    return {"a": smth, "b": 2, "c": 3 }; 
} 

jednak pewien wyjątek muszę dodać jest zwrócony obiekt nie wydaje się dobrze bawić się przy użyciu metody dodawania Shape.prototype.methodname

Więc o ile mi mogą pracować na zewnątrz, na przykład pierwotnego trzeba by zrobić:

function Shape(smth) { 
    return {"a": smth, 
      "b": 2, 
      "c": 3, 
      doCalculus: function() { 
       return this.a * this.b + this.c - (2 * (this.b + this.c) + this.a); 
      } 
    } 

Więc nadal skończyło się z tego (-y), a straciliśmy advantag es metod rozdzielania pod prototype. Próbowałem też, aby jslint przekazał mój kod bez zaznaczania pola "Toleruj ... to", ale doszedłem do wniosku, że o wiele lepiej jest po prostu użyć this. Wszyscy z wyjątkiem Douglasa Crockforda wydają się akceptować to jako integralną część javascript.

4

Możliwe jest uniknięcie użycia this w konstruktorze, poprzez użycie Object.create do utworzenia łańcucha prototypów, a następnie zadeklarowanie swoich właściwości bezpośrednio na wynikowym obiekcie.

function Shape(smth) { 
    var shape = Object.create(Shape.prototype); 

    shape.a = smth; 
    shape.b = 2; 
    shape.c = 3; 

    return shape; 
} 

Eliminuje to potrzebę this w funkcji Shape, co oznacza, że ​​nie muszą już dzwonić go new albo.

new Shape(1); // { a: 1, b: 2, c: 3, __proto__: Shape.prototype } 
Shape(1);  // { a: 1, b: 2, c: 3, __proto__: Shape.prototype } 

Jednak nadal będziesz musiał użyć this wewnątrz twoich metod prototypowych odnieść się do właściwej instancji.

0

Jeśli chcesz uniknąć „to”, można zrobić to tak:

const shape = smth => { 
     let a = smth, 
      b = 2, 
      c = 3; 
     return { 
     doCalculus:() => a * b + c - (2 * (b + c) + a) 
     } 
    } 

    console.log(shape(2).doCalculus()); // -5