Kleiner Nachteil bei Crockford Prototypical Inheritance

8

Ich experimentierte nur mit verschiedenen Vererbungstechniken in JS und stieß auf etwas, das Crockfords Prototyp-Vererbungsmuster leicht befremdete:

%Vor%

Es ist alles gut - außer wenn Sie sich an der Konsole anmelden - das Objekt erscheint als F. Ich habe klassische Emulation gesehen, in der Sie den Konstruktor neu positionieren können - gibt es eine ähnliche Methode, um die Objekte zu zwingen (Konsole) Referenz?

    
sunwukung 09.11.2011, 23:12
quelle

2 Antworten

13

Das Problem ist, dass es sich auf die name der Konstruktorfunktion bezieht. Dies wird schnell zu einer Diskussion über Funktionsausdrücke und -anweisungen und die Namenseigenschaft. Es stellt sich heraus, dass es völlig unmöglich ist, eine neue benannte Funktion zur Laufzeit ohne eval zu erstellen. Namen können nur mit einer Funktionsanweisung function fnName(){} angegeben werden, und es ist nicht möglich, diesen Codeabschnitt dynamisch zu erstellen, abgesehen davon, dass er ausgewertet wird. var fnExpression = function(){} führt zu einer anonymen Funktion, die einer Variablen zugewiesen ist. Die Eigenschaft name der Funktionen ist unveränderlich, also ist es ein abgeschlossener Deal. Die Verwendung von Function("arg1", "arg2", "return 'fn body';") kann auch nur eine anonyme Funktion erzeugen, obwohl sie eval ähnlich ist.

Es ist im Grunde nur ein Versehen in der JS-Spezifikation (Brendan Eich gab an, dass er bedauert, den Anzeigenamen so zu definieren, wie er es vor etwa 10 Jahren getan hat) und eine Lösung wird für ES6 diskutiert. Dies würde mehr Semantik zum Ableiten des Anzeigenamens einer Funktion für Debug-Tools oder vielleicht eine explizite Möglichkeit, sie einzustellen und anzupassen, einführen.

Für jetzt haben Sie eine Route: eval oder irgendeine andere Form der späten Ausführung von konfigurierbarem Code. (Eval mit einem anderen Namen ...)

%Vor%

Die Funktion statement alone wird nicht von eval zurückgegeben, aber 1 & amp; & amp; fnStatement erzwingt das Ding in einen Ausdruck, der zurückgegeben werden kann.

(Harmony Proxies erlauben auch das Einrichten von Funktionen, die Namen melden, die Sie ohne eval konfigurieren können, die aber außer in Node.js und Firefox derzeit nicht verwendbar sind.)

Ich werde hier notieren, dass all diese "bösen" Funktionen, die von Crockford und vielen anderen ALLEN getan wurden, ihren Platz haben. eval , with , alle anderen ermöglichen spezielle Techniken, die sonst völlig unmöglich sind und es ist nicht falsch, sie zu verwenden, wenn der Anlass richtig ist. Es ist wahrscheinlich, dass die meisten Menschen nicht qualifiziert sind, zu beurteilen, wann diese Zeit richtig ist. Meiner Meinung nach ist die Verwendung von eval harmlos, um die Semantik und Tools für schlechte Sprachen zu kompensieren, während man auf eine Lösung wartet, völlig akzeptabel und verursacht keinen Schaden, solange man keinen willkürlichen Code in diese Eval-Anweisung einfließen lässt.

    
user748221 10.11.2011, 08:10
quelle
0

Wenn ich das Objekt protokolliere, sehe ich: Object { foo="bar", baz=function()} , also verstehe ich dein Problem nicht ...

Wie auch immer, kann Object.create () anstelle von Crockfords Funktion verwenden:

%Vor%

console.log (C):

Object { foo="bar", baz=function()}

    
Gabriel Llamas 06.03.2012 15:12
quelle