2013-10-19 18 views
7

Witaj, układarki.Jak uzyskać dostęp do statycznego elementu na instancji?

Oto kod, z którym walczę od wielu godzin, chodzi o to, aby śledzić liczbę utworzonych instancji, ale także umożliwić wywołanie metody statycznej i zmianę/aktualizację statycznego elementu. Jest podobne pytanie, ale nie mogę wdrożyć żadnego rozwiązania mojego problemu.

Dla uproszczenia zmieniłem tutaj nazwę konstruktora i członka. Myślę, że to oczywiste, co się dzieje. Chcę, aby zarówno obiekt konstruktora, jak i instancja współużytkowały tę samą właściwość statyczną.

Mogę uzyskać dostęp do statycznego elementu na obiekcie konstruktora, ale na instancji dostałem niezdefiniowany.

Każda pomoc zostanie doceniona.

Podziękowania zarówno dla mor, jak i Aeorila. Z uwagi na to, że to pytanie było zlokalizowane, odpowiedź obojga pomaga mi lepiej zrozumieć prototypowe dziedziczenie. P.S. W JavaScript nie ma czegoś takiego jak element statyczny, instancja obiektu nie dziedziczy bezpośrednio, tak jak się tego spodziewałem. Tutaj jest prototypowa magia. Dzięki

Odpowiedz

6

EDIT: I ponownie przeczytać pytanie, a ten kod rozwiązuje rzeczywiste problemy, jak stwierdził:

JavaScript:

function Foo() { 
    this.publicProperty = "This is public property"; 
    Object.getPrototypeOf(this).count++; 
} 
Foo.prototype.count = 0; 

console.log(new Foo().count, new Foo().count, Foo.prototype.count); 

Nie spowoduje to jednak zmniejszenia wartości licznika automatycznie, jeśli obiekt zostanie zwolniony do zbierania śmieci, ale można użyć wartości usunąć następnie ręcznie zmniejszać.

+0

Tak, widziałem to teraz. Chodzi o to, że udostępniam tę samą zmienną między konstruktorem obiektów a jej instancją, ale również potrafię uruchomić metodę statyczną lub metodę na konstruktorze obiektów. W ostatecznym wywołaniu dziennika staticProperty na instancji jest niezdefiniowane. –

+1

Pokazałem, że myFoo.staticProperty było niezdefiniowane w logu w celu zilustrowania tego bez funkcji "kludge", jak myFoo.returnFooStaticProperty() Nie sądzę, że można uzyskać dostęp do statycznego elementu członkowskiego z obiektu instancji. Funkcja "kludge" działa, ale czy możesz wyjaśnić, dlaczego chcesz udostępnić zmienną statyczną między klasą a jej instancjami? Być może ponowne przemyślenie sposobu działania z prototypami (i dziedziczeniem) byłoby opłacalne? – Aeoril

+0

Tak, jak wspomniałem, podejście prototypowe czasami mnie wprawia w zakłopotanie.Chodzi o to, że statyczne elementy są współużytkowane przez wszystkie instancje i samą funkcję klasy/konstruktora, ale jej wartość jest przechowywana w jednym miejscu, co oznacza, że ​​instancje obiektów nie dziedziczą tej wartości. I tu pojawia się prototyp. Jedyną różnicą między twoją a mors jest to, że muszę wywołać metodę na funkcji konstruktora. –

5

Można próbować uzyskać dostęp do właściwości statycznych za pośrednictwem konstruktora

console.log(myFoo.constructor.staticProperty); 
+1

Co dokładnie dzieje się w takim przypadku? Czy wskazuję, że konstruktorem myFoo jest Foo, ponieważ jest to właściwość statyczna powiązana z funkcją konstruktora Foo? –

+0

To działało w kompilacji Typescript + Webpack dla mnie. – Learner

2

Javascript opiera prototypu. Innymi słowy, wszystkie wystąpienia obiektu mają ten sam prototyp. Następnie można użyć tego prototypu umieścić statyczne współdzielonych właściwości:

function Foo() { 
    this.publicProperty = "This is public property"; 
} 

Foo.prototype.staticProperty = "This is static property"; 

var myFoo = new Foo(); 
console.log(myFoo.staticProperty); // 'This is static property' 

Foo.prototype.staticProperty = "This has changed now"; 
console.log(myFoo.staticProperty); // 'This has changed now' 
+0

Ale w takim przypadku obiekt Foo() konstruuje luźne elementy statyczne. –

+0

@AlanKis, nie ma. Zawsze możesz odwoływać się do niego, używając 'this.prototype.staticProperty'. – mor

+0

Tak, masz rację. Podejście JS OOP czasami mnie dezorientuje. –

Powiązane problemy