2009-05-21 8 views
1

Es gibt eine gute verallgemeinerte Methode zum Definieren privater und geschützter Eigenschaften und Methoden in Javascript, here on the site. Die aktuelle Version von Prototype (1.6.0) verfügt jedoch nicht über eine integrierte Möglichkeit, sie über ihre Syntax Class.create() zu definieren.Verwenden von Class.create von Prototyp zum Definieren privater/geschützter Eigenschaften und Methoden

Ich bin gespannt, was die besten Praktiken sind, wenn Entwickler private und geschützte Eigenschaften und Methoden bei der Verwendung von Prototype definieren möchten. Gibt es einen besseren Weg als den allgemeinen?

Antwort

1

Sie können lokale Variablen in Ihrer Konstruktorfunktion (initialize) für den Prototyp verwenden und dann einen Abschluss erstellen, der auf Ihre öffentlichen Methoden zugreift oder diese Variable verfügbar macht.

Hier ist ein Codebeispiel:

// properties are directly passed to `create` method 
var Person = Class.create({ 
    initialize: function(name) { 
     // Protected variables 
     var _myProtectedMember = 'just a test'; 

     this.getProtectedMember = function() { 
     return _myProtectedMember; 
     } 

     this.name = name; 
    }, 
    say: function(message) { 
     return this.name + ': ' + message + this.getProtectedMember(); 
    } 
}); 

Hier Douglas Crockford Theorie zu diesem Thema.

http://www.crockford.com/javascript/private.html

+0

Awesome. Vielen Dank. Ich habe auch die Antwort von TML gewählt, da der Link, den er enthält, eine vollständige Diskussion zu diesem Thema enthält und zeigt, warum andere (sauberere) Implementierungen nicht funktionieren. –

+1

@SleepyCod: Wie würden Sie eine vollständig gekapselte private Variable definieren, also eine, die keinen Setter oder Getter hat? Ihr Beispiel hat einen Getter, so dass andere Klassenmethoden das Feld erhalten können, das aber das Feld der Außenwelt zugänglich macht. – JoJo

+0

@Christophe Eblé Dies ist keine private Methode. Use var getProtectedMember = function() {... Es ist dann jedoch nicht möglich, innerhalb anderer Methoden auf diese Methode zuzugreifen, aber auf sie kann nicht von außerhalb der Klasse zugegriffen werden. Ich untersuche, ob es möglich ist, dass eine Methode von innen, aber nicht von außen zugänglich ist ... –

2

Es gibt eine Diskussion here im Leuchtturm von Prototype, die zeigt, warum Sie diesen Effekt mit Class.create von Prototype nicht erhalten können.

+0

Können Sie mir den Zugang zu diesem Link geben? Ich stimme Ihrer Meinung zu, aber ich würde gerne die Diskussion sehen, aber es erfordert ein Login. Es würde mir nicht erlauben, meinen Google-Login zu verwenden ... –

+1

[Hier] (http://web.archive.org/web/20081204014823/http://prototype.lighthouseapp.com/projects/8886/tickets/152- implement-private-variables-for-classes ist ein Link zu der von archive.org erfassten Diskussion. – TML

+0

Danke. Dies ist eine sehr interessante Diskussion. Ich würde gerne sehen, dass dies umgesetzt wird. Ich habe mir den Patch genau angeschaut und er sieht ziemlich solide aus. Ich werde einige Tests mit dem Patch in Prototyp-1.7.3.js durchgeführt und sehen, ob das zuverlässig ist ... –

0

Der Schlüssel ist, die öffentlichen Methoden wie Verschlüsse, wie im Beispiel unten hinzuzufügen:

Bird = Class.create (Abstract,(function() { 
    var string = "...and I have wings"; //private instance member 
    var secret = function() { 
     return string; 
    } //private instance method 
    return { 
     initialize: function (name) { 
      this.name = name; 
     }, //constructor method 
     say: function (message) { 
      return this.name + " says: " + message + secret(); 
     } //public method 
    } 
})()); 

Owl = Class.create (Bird, { 
    say: function ($super, message) { 
     return $super(message) + "...tweet"; 
    } //public method 
}) 

var bird = new Bird("Robin"); //instantiate 
console.log(bird.say("tweet")); //public method call 

var owl = new Owl("Barnie"); //instantiate 
console.log(owl.say("hoot")); //public method call inherit & add 
Verwandte Themen