2015-04-21 26 views
7

Czy można uzyskać dostęp do właściwości obiektu/funkcji konstruktora bez tworzenia z niego instancji?Uzyskiwanie dostępu do właściwości konstruktora bez tworzenia nowej instancji

Na przykład, powiedzmy, że mam tego konstruktora:

function Cat() { 
    this.legs = 4; 
}; 

a teraz - bez tworzenia nowej instancji koci - Chcę wiedzieć, co jest wartością legs wewnątrz konstruktora. czy to możliwe?

(I nie szukam rzeczy, takich jak:. var legs = new Cat().legs (Powiedzmy, że instancji nowego Kot jest super CPU kosztowne dla jakiegoś powodu).)

+0

Może zadeklarować to poza konstruktorem, skoro jest tak zakodowany?Następnie możesz przekazać go do konstruktora, a także uzyskać dostęp do niego poza nim. – CodeVirtuoso

+0

Możesz połączyć Cat: 'function Cat() {this.legs = 4; zwróć to; } '=>' Cat(). Legs'. Ale nadal potrzebujesz tych "CPU Cycles", aby uruchomić funkcję – CodingIntrigue

+1

Wiele rzeczy jest możliwych, niektóre z nich nawet nie mają sensu :). Wywołaj 'Cat.toString()' i przeanalizuj wynik. – Igor

Odpowiedz

1

W swoim scenariuszu leg jest zmienną instancji, co oznacza, że ​​instancja obiektu jest potrzebna, aby uzyskać do niej dostęp.

Możesz uczynić go pseudo-class variable (patrz class variable in Javascript), powinieneś być wtedy w stanie uzyskać do niego dostęp bez wywoływania funkcji (tworzenie obiektu).

+0

Czy mogę jakoś (w czysty sposób) nie sprawić, że nogi będą zmienną instancji? Przypuszczam, że powiązanie tego z "tym" jest tym, co robi, ale jakie są moje opcje? –

+0

@ KristofferK-move * nogi * poza konstruktorem: 'var legs = 12; function Cat() {this.legs = nogi; ...}; ' – RobG

+0

@KristofferK: Zaktualizowałem swoją odpowiedź z sugestią dotyczącą zmiennych klas. – Cristik

1

Jest jeszcze droższe:

console.log(parseInt(Cat.toString().match(/this\.legs\s*=\s*(\d+)/)[1])); 
+0

Zwłaszcza, gdy * match * może zwrócić * null *, a 'null [1]' spowoduje błąd. ;-) – RobG

+0

Tak, musisz wiedzieć, że ten element rzeczywiście istnieje i że jest to numer – devnull69

-3
// cat.js 
function Cat() { 

} 

Cat.prototype.legs = 4; 

// somescript.js 
var legs = Cat.prototype.legs 
var cat = new Cat(); 
console.log(legs, cat.legs); // 4, 4 
4

Czy coś jak to liczyć?

function Cat() { 
    this.legs = 4; 
} 

var obj = {}; 
Cat.call(obj); 
console.log(obj.legs); // 4 
+5

Pozwala to uniknąć powierzchownego tworzenia nowej instancji. Nie uniknie wystąpienia "super CPU kosztownego". – JJJ

0

Krótko mówiąc, żaden nie ma dostępu do tej zmiennej bez tworzenia instancji, ale można obejść:

zmienna globalna

Zakładając „nogi” może się zmieniać podczas działania aplikacji możesz utworzyć "globalną" zmienną, przypisując nogi do "okna", obiektu, który będzie istnieć przez cały okres istnienia strony:

window.legs = 4; // put this at the top of your script 

Następnie w trakcie trwania aplikacji, można zmienić dopóki nie jesteś gotowy do użycia go w Koty():

window.legs = user_input; 

globalnego obiektu

Można nawet przypisać obiekt do okna jeśli chcesz mieć inne koty, nietrwałych atrybuty:

window.Cat = {}; 
window.Cat.legs = 4; 
window.Cat.has_tail = true; 
window.Cat.breeds = ["siamese","other cat breed"]; 

Jak korzystać Globals

Wtedy, gdy obiekt Kot jest stworzony później, można wyciągnąć dane z okna, aby utworzyć wystąpienie cat:

function Cat(){ 
    this.legs = window.legs; 
    //or 
    this.legs = window.Cat.legs; 
} 
+1

Dzięki za odpowiedź! Tak, przechowywanie danych na zewnątrz/globalnie jest prawdopodobnie tym, co skończę robić, ale chciałbym mieć to wszystko w jednym miejscu (najlepiej w funkcji konstruktora). Ale jest prawdopodobnie coś niedoskonałego w tej ambicji i prawdopodobnie muszę to przemyśleć. Dzięki jeszcze raz. –

+0

@ Kristoffer K, co powiesz na odpowiedź "Amir Popovich" – ozil

+0

Odpowiedź @Amir Popovich Odpowiedź nadal tworzy instancję Cat. Technicznie tego nie robi. –

1

istnieje sto sposobów, aby to zrobić, ale poniżej statyczny domyślny wzór jest tak dobry, jak którykolwiek z nich:

function Cat(opts) { 
    var options = opts || {}; 
    this.legs == options.legs || Cat.defaults.legs; 
}; 

Cat.defaults = { 
    legs: 4 
} 

var myCat = new Cat({legs:3}); //poor guy 
var normalNumberOfCatLegs = Cat.defaults.legs; 
+0

To właśnie właśnie zacząłem odkrywać, dzięki! –

Powiązane problemy