2013-09-07 14 views
6

In PHP zumindest in meiner Instanz ist es sehr üblich, magische Methoden zu verwenden - zumindest bei der Definition Ihrer Kernklassen, von denen die meisten von allem anderen sich erstrecken.Javascript Magic Methoden

Magic Methoden in PHP verhalten sich in einer besonderen Weise von der Norm Ihrer normalen Methoden. Zum Beispiel eine der häufigsten Methoden in meinem Buch zu spielen wäre die __construct()

Das Konstrukt wird jedes Mal ausgeführt, wenn eine Klasse geladen wurde. So zum Beispiel, wenn Sie Ihre Klasse einführen selbst wollte könnten Sie so etwas tun:

<?php 
class Person 
{ 
    function __construct($name) 
    { 
     $this->name = $name; 
     $this->introduceYourself(); 
    } 

    public function introduceYourself() 
    { 
     //if $this->name then echo $this->name else echo i dont have name 
     echo $this->name ? "hi my name is " . $this->name : "error i dont have name"; 
    } 
} 

$dave = new Person('dave'); 

Normalerweise würden Sie nicht etwas, auf das Konstrukt passieren.

Einige andere, die ich über halb häufig laufen sind:

__call(), die Sie die Standard Art und Weise ändern können, die Methoden aufgerufen werden. Ein gutes Beispiel ist eine Überschreibung, mit der Sie Attributwerte abrufen können, wenn Sie eine Methode verwenden, die mit dem Wort get beginnt oder Attributwerte setzt, wenn ein Methodenaufruf mit dem Wortsatz beginnt.

__get() verwendet als Überlader für Klassenattribute, ich benutze nicht, aber jemand könnte interessiert sein.

__set() verwendet als Überlader für Klassenattribute, ich benutze nicht, aber jemand könnte interessiert sein.

__destruct() verwende ich auch nicht, aufgerufen, sobald keine anderen Verweise auf ein bestimmtes Objekt oder in irgendeiner Reihenfolge während der Abschaltsequenz vorhanden sind.

Die Frage

Gibt es magische Methoden wie diese innerhalb von Javascript?

Gibt es versteckte Juwelen, die ein neuer JavaScript-Programmierer beachten sollte, wie die oben für php beschriebenen?

+0

Mögliches Duplikat von [this] (http://stackoverflow.com/questions/6303896/magic-methods-in-javascript) Schauen Sie auch [hier für \ _ \ _ noSuchMethod \ _ \ _] (http://stackoverflow.com/questions/994143/javascript-getter-for-all-properties). – ComFreek

+0

Möglich, aber niemand kümmerte sich darum, diejenigen zu beantworten oder zu bestätigen oder abzulehnen, nach denen ich gezielt suche. Oder eine "emulierte" Lösung. – ajameswolf

Antwort

8

Wenn von „Magie“ Sie Methoden bedeuten, die implizit genannt werden, hat Javascript toString und valueOf:

> foo = {toString: function() { return 'hi' }} 
> foo + " there" 
"hi there" 

> foo = {valueOf: function() { return 100 }} 
> foo - 5 
95 

Allerdings gibt es keine Standardmethode Operatoren (welche PHP/Python magische Methoden tatsächlich neu zu definieren tun) in aktuellen Javascript-Versionen. Harmonie (Javascript 6) wird proxies API für diese Art von Arbeit enthalten. This blog entry liefert Beispiele und Erläuterungen zu den Proxies, hier ist ein Ausschnitt von dort die __get zu PHP ähnlich funktioniert:

var p = Proxy.create({ 
    get: function(proxy, name) { 
    return 'Hello, '+ name; 
    } 
}); 
document.write(p.World); // should print 'Hello, World' 

Dies funktioniert bereits in Firefox, Chrome-Unterstützung verfügbar ist, wenn Sie zu about:flags und schalten Sie experimentelle JavaScript gehen.

+1

Chrome-Unterstützung ist verfügbar, wenn Sie zu "about: flags" gehen und experimentelles JavaScript aktivieren :) Hinweis: "Proxy" kann auch tun, was "__call" tut - und im Allgemeinen ist die Reflektion in JavaScript sehr einfach. –

+0

@BenjaminGruenbaum: danke, bearbeitet! – georg

1

Um zu @ thg435 Antwort hinzufügen,

Der Code, den Sie oben leicht umgeschrieben werden, schrieb als

// this is your __construct 
var Person = function Person(name) { 
    this.name = name; 
    this.introduceYourself(); 
}; 

// this is public function introduceYourself 
Person.prototype.introduceYourself = function introduceYourself() { 
    this.name 
    ? console.log("hi my name is", this.name) 
    : console.log("error i don't have a name") 
    ; 
}; 

var dave = new Person("dave"); 

Kurze Antwort: es kein Protokoll der Magie geschieht in JavaScript und (imo) das ist gut. Ich mag keine impliziten Dinge. Ein Kommentator erwähnt __noSuchMethod__ und yikes! MDN sagt, dass es nicht Standard ist und die Seite nicht einmal weiß, welche JavaScript-Versionen es unterstützen.

Sie könnten in harmony proxies als Teil der neuen ECMAScript 6. interessieren Sie einige Informationen über Simulating noSuchMethod and doesNotUnderstand

+0

sieht wie ein __construct für mich aus :) – ajameswolf

+0

Wie über die __call .. im Wesentlichen sollte die Logik so gehen, wenn eine Methode nicht innerhalb der Deklaration oder Kette von Prototypen existiert dann diese Methode die Übergabe der aufgerufenen Methodenname als ein Parameter und die übergebenen Werte als Array für den zweiten Wert. – ajameswolf

2

JavaScript eine der wenigen prototypal languages ist sehen werden, wie Lua ist. Wenn Sie nach der constructor suchen, ist es so benannt (siehe unten). Alle Objekte in JavaScript sind von base-Object abgeleitet.

Praktisch alle Ihre Antworten in Bezug auf JavaScripts magic- "Methoden" wurden bereits in Hidden features of JavaScript aufgenommen. Besuchen Sie diese StackOverflow-Website, um ein wenig mehr über die Syntax und das Verhalten von JavaScript sowie Besonderheiten zu erfahren, beispielsweise in Bezug auf comparison operations.

Im Folgenden finden Sie einige praktische Beispiele, die Ihnen helfen, das Verhalten zu verstehen (und zirkuläre Referenzen, wenn es um die Serialisierung von JavaScript-Objekten und ihren Import in PHP geht).

0 .constructor 
function Number() { [native code] } 

0 .constructor(10) 
>> 10 

var myObj = function(){ console.log("I am a new function"); } 
>> undefined 
myObj.constructor 
>> function Function() { [native code] } 
myObj.constructor() 
>> function anonymous() {} 
myObj.prototype.constructor() 
>> I am a new function 

myObj === myObj.prototype.constructor 
>> true 

x = new myObj 
>> I am a new function 
<< myObj {} 

x.constructor() 
>> I am a new function 
<< undefined 

Ich schrieb ein outline of newer language Feature, aber es gibt darunter auch viele andere großen Ressourcen SO, und die Verbindungen bereits von meinen Kollegen hier zur Verfügung gestellt.