2012-09-16 11 views
5

Stworzyłem więc funkcję jak ten,utworzyć funkcję w javascript z niestandardowego prototypu

var functionName = function(arg1) { //code logic here; } 

Jednocześnie, muszę tę funkcję, aby pracować jako przedmiot. Tak naprawdę nie zapisuje niczego, ale dane będą dostępne z innego obiektu.

var myObj = new Object(); 
myObj.x = 3; 
myObj.y = 4; 

Więc kiedy odejdę, functionName.x powinien powrócić myObj.x. Obiekt myObj jest utrzymywany w innym miejscu i nie mam nad nim żadnej kontroli.

To jak ja obecnie realizowane go

functionName.__proto__ = myObj; 

To działa dobrze. Ale __proto__ jest już przestarzałe i chciałbym zobaczyć, czy istnieje inny bezpieczny sposób to zrobić. Pomyślałem o nadpisaniu Function.prototype, ale to nie działa.

+0

Dlaczego nie można po prostu przechowywać w ** functionName ** tylko odniesienie do myObj ** **? – Kryz

+0

@Kryz nie jestem pewien Rozumiem, nie mogę zrobić functionName = myObj, bo to zastąpi definicję funkcji.Teraz funkcja functionName jest dostępna jako functionName() i functionName.x, więc muszę zachować to zachowanie –

+0

Uwaga boczna: myObj powinien prawdopodobnie pochodzić od Function.prototype, więc nadal masz dostęp do functionName.bind, itp. (Oczywiście, nie ma to nic wspólnego z pierwotnym problemem). – Marc

Odpowiedz

1

Chcesz wdrożyć delegata do myObj:

 var functionName = function(arg1) { // code } 

    functionName.myObj = new MyObj(); 
    for (prop in functionName.myObj) { 
     if (functionName.myObj.hasOwnProperty(prop)) { 
     functionName.__defineGetter__(prop, function() { return functionName.myObj[prop]; }); 
     } 
    } 
+0

co tu widzę jest za każdym razem functionName() jest wywoływana jako funkcja, przejdzie przez każdy element w myObj. Które może być powolne. Ten obiekt może zawierać do 500 elementów. A jeśli functionName() nigdy nie zostanie wywołane, wtedy gettery nie zostaną zdefiniowane. Na przykład niektóre strony będą po prostu używać functionName.x bezpośrednio bez użycia functionName() –

+0

Zakładam, że functionName był konstruktorem. Aktualizowanie odpowiedzi do pracy dla normalnej funkcji. –

+0

Chyba brakowało mi tutaj punktu. myObj jest już gdzieś zdefiniowany i zachowuje kolekcję dynamicznych obiektów. Oznacza to, że w czasie wykonywania może utracić lub zyskać więcej elementów. Nie mogę skopiować zawartości do functionName, ponieważ po aktualizacji myObj nie będzie to zsynchronizowane z functionName.Potrzebuję functionName, lub jej prototyp, do posiadania refernce do myObj. Działa to, gdy robię functionName .__ proto__ = myObj, ale muszę znaleźć alternatywę dla __proto__ use, –

-1

Można ustawić prototype funkcji.

function functionName(arg1) { 
    //code logic here; 
} 

var myObj = { x: 3, y: 4 }; 
functionName.prototype = myObj; 

var obj = new functionName(); 
console.log(obj.x, obj.y); // will output 3, 4 
+0

Potrzebuję uzyskać dostęp do nich bezpośrednio z functionName. Użycie functionName() i functionName.x jest na różnych stronach i nie będzie wystarczająco praktyczne, aby je zmienić. –

+1

To wcale nie odpowiada na pytanie PO. OP chce utworzyć funkcję z niestandardowym '__proto__'. To nie robi tego. Dlatego należy go usunąć. –

1

Mam ten sam problem tutaj. Niestety, nie ma dobrego rozwiązania w EcmaScript 5.1.

W specyfikacji językowej http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf podano w 13.2 "Tworzenie obiektów funkcji", że własność wewnętrzna [[Prototyp]] nowo utworzonego obiektu funkcji jest zawsze standardowym wbudowanym obiektem prototypowym Function.

Jak opisano w 13.3 tej samej specyfikacji, użycie konstruktora Function również nie ma żadnego znaczenia, ponieważ funkcja skonstruowana przez new Function(…) również korzysta z metody opisanej w 13.2. (Jest to odzwierciedlone przez fakt, że własność Functionprototype jest ani zapisywać ani konfigurować.

Tak, aby osiągnąć to, co chcesz, musisz sposób zmienić prototyp już istniejących obiektów. Na szczęście, średnia zbliżający ECMAScript 6 wydaje się, standaryzuje Object.prototype.__proto__ zgodnie z załącznikiem B.2.2 w ostatnim projekcie http://wiki.ecmascript.org/lib/exe/fetch.php?id=harmony%3Aspecification_drafts&cache=cache&media=harmony:working_draft_ecma-262_edition_6_05-14-13-nomarkup.pdf.

Powiązane problemy