2016-07-01 28 views
5

Czy istnieje sposób na ujawnienie prototypów obiektów przez inny obiekt?Wystawianie prototypów w obiekcie

var foo = function() { 
    var foo = { 
     bar: bar, 
     boo: boo 
    } 
    return foo; 

    function bar (age) { 
     this.age = age; 
    } 
    bar.prototype.shoutAge = function() { 
     alert('My age is ' + this.age); 
    } 

    function boo (age) { 
     this.age = age; 
     boo.prototype.shoutAge = function() { 
     alert('My age is ' + this.age); 
     } 
    } 
    } 

    var foo = foo(); 
    var far = new foo.bar(13); // bar {age: 13} 
    far.shoutAge(); // far.shoutAge is not a function 

    var far = new foo.boo(13); // boo {age: 13} with __proto__ 
    far.shoutAge(); // alert('My age is 13'); 

W tym kodzie „bar” obiekt jest ustawiony z prototypowego dziedziczenia - ale narażając bar traci dziedziczenie „shoutAge”.

Jednak „boo” w obiekt ma prototyp zadeklarowane wewnątrz niej, a funkcja zewnątrz ma dostęp do metody „shoutAge”.

Nie sądzę, że ta ostatnia jest najlepszą praktyką, mimo że działa. Więc jaka byłaby najlepsza praktyka?

Nie chcę każde wystąpienie „bar” mieć to metoda własnego „shoutAge”, zwłaszcza jeśli nie są potencjalnie setki wystąpień „bar”. Czy zwykle tworzysz osobny obiekt dla 'bar' zamiast prezentowania go przez 'foo'?

+0

Gdzie jest dziedziczenie? Ani 'bar' ani' boo' nie dziedziczą się od siebie ani 'foo'. –

+0

'far' dziedziczy po' bar.prototype' lub 'boo.prototype' – Oriol

+0

Spróbuj lintować swój program. –

Odpowiedz

3

Wygląda na to tylko rozkaz-of-operacjach problem:

var Foo = function() { 

    function bar (age) { 
    this.age = age; 
    } 
    bar.prototype.shoutAge = function() { 
    alert('My age is ' + this.age); 
    } 

    var foo = { 
    bar: bar, 
    boo: boo 
    } 
    return foo; 
} 

Myślę, że to dlatego, że nigdy nie jest przyporządkowanie bar.prototype wykonywane w kodzie. Definicja funkcji bar otrzymuje hoisted, więc jest dostępna w obiekcie, który zwrócisz, ale przypisanie prototypu jest dodatkową instrukcją występującą po instrukcji return, a przepływ sterowania nigdy jej nie osiąga. Po prostu przeniesienie return do końca rozwiązuje problem.

+0

+1, dobre wytłumaczenie. Być może warto też podać link do tego, czym jest podnoszenie, na wypadek, gdyby OP nie był świadomy. –

+0

@OmriAharon Dodano. – nrabinowitz

+0

To miało dużo sensu, kiedy go czytałem, a ja tylko na krótko napotkałem podnoszenie w przeszłości. Niestety to wciąż rzuca tak daleko.shoutAge nie jest funkcją. Oto przykład [jsfiddle] (https://jsfiddle.net/7j8ws41c/1/). * edytuj * Nieważne Miałem przypisywanie tego błędu w skrzypcach, to działa. – amarshall