var Foo = new Class({ Extends: Bar, initialize: function(firstname, lastname) { this.parent(firstname); this.lastname = lastname; }, sayHello: function(){ alert(this.lastname || this.firstname); } });
通常のライブラリのラッパーは、Javascriptとプロトタイプ指向プログラミングのイデオロギーと矛盾しません。 それらは、便利なインターフェース、その使用のエイリアスを提供するだけです。 もちろん、ある種のzhzhopnyメソッドを介して「JavascriptのOOP」を実装するライブラリがありますが、現在はそのようなことを考慮せず、Mutulzの例でそれらを検討します 。
たとえば、建設用
MyClass = function() {/* constructor */}; MyClass.prototype.firstMethod = function() {/**/}; MyClass.prototype.secondMethod = function() {/**/}; MyClass.prototype.thirdMethod = function() {/**/};
MyObject.prototype
を繰り返さないようにするエイリアスが導入されました。 この設計なしで実行しないでください。繰り返してはいけません。 ライブラリ内ではすべてが同じになります
MyClass = new Class({ initialize : function() {/* constructor */}, firstMethod : function() {/**/}, secondMethod: function() {/**/}, thirdMethod : function() {/**/} });
継承のための次の構成(Javascriptイデオロギーと完全に一貫しており、
instanceof
を使用して「キャッチ」されることに注意してください)
MyAnotherClass = function() {/* constructor */}; var Tmp = function() { } Tmp.prototype = MyClass.prototype MyAnotherClass.prototype = new Tmp() MyAnotherClass.prototype.constructor = MyAnotherClass;
このような単純なエントリにカプセル化されています:
MyAnotherClass = new Class({ Extends: MyClass });
そして、多くの、多くの、多くの。 要するに、JavaScriptのイデオロギーに違反しないということです。 それに適応し、便利なインターフェイスを提供しますが、内部はプロが行うのと同じです。 結局のところ、プロトタイプ指向プログラミングのイデオロギーは、「プロトタイプ」という言葉の冗長性と絶え間ない言及ではなく、信じられないほどの拡張性です。
オーバーロードされたコンストラクター
そして、イデオロギーは、別の非常に有害で非常に人気のあるアプローチ-オーバーロードされたコンストラクターによって違反されています:
var MyClass = function() { /* */ this.firstMethod = function() {/**/}; this.secondMethod = function() {/**/}; this.thirdMethod = function() {/**/}; /* , */ }; var MyAnotherClass = function() { // MyClass.apply(this, arguments); this.elseOneMethod = function() {/**/}; }; var myAC = new MyAnotherClass(); console.log(myAC instanceof MyClass); // false
継承できないため、
instanceof
が機能し、オブジェクトが作成されるたびに関数が作成されるため、メモリが川のように流れ、プロセッサが泣くのです。 関数を1か所で作成してリンクを提供する代わりに、毎回作成します。 これらの関数はプロトタイプには存在しません(ただし、Array、Numberなどの組み込みオブジェクトには残りがすべてプロトタイプにあります)、再定義またはコンテキスト外で受信することはできません。
var MyClass = function() { this.method1 = function(){}; }; MyClass.prototype.method2 = function(){}; var myClass = new MyClass; console.log(myClass.hasOwnProperty('method1')); // true console.log(myClass.hasOwnProperty('method2')); // false var Foo = function() { this.method1 = function(){}; this.method2 = function(){}; this.method3 = function(){}; this.method4 = function(){}; this.method5 = function(){}; this.method6 = function(){}; this.method7 = function(){}; this.method8 = function(){}; this.method9 = function(){}; } var Bar = function() {}; Bar.prototype.method1 = function(){}; Bar.prototype.method2 = function(){}; Bar.prototype.method3 = function(){}; Bar.prototype.method4 = function(){}; Bar.prototype.method5 = function(){}; Bar.prototype.method6 = function(){}; Bar.prototype.method7 = function(){}; Bar.prototype.method8 = function(){}; Bar.prototype.method9 = function(){}; /** * Chrome 8 * Foo: 260 * Bar: 26 * Firefox 3.5 * Foo: 22081 * Bar: 158 */ console.time('Foo'); for (var i = 1000000; i--;) new Foo(); console.timeEnd('Foo'); console.time('Bar'); for (var i = 1000000; i--;) new Bar(); console.timeEnd('Bar');
Internet Explorerで何が起こるかについては沈黙しています。 自分でチェックしてください。 夜にコンピューターの電源を入れたままにすることができます=)
擬似プライベートメソッドと変数を実装できるという事実でさえ、このアプローチをほんの一瞬正当化するものではありません。
繰り返しますが、オーバーロードされたコンストラクターの欠点は次のとおりです。
*
instanceof
は子では機能しません
* 大幅に高いメモリ消費
*数十から数百倍遅い
*プロトタイプにはメソッドがありません
*メソッドはhasOwnPropertyを介して正しく定義されていません
おわりに
ユーザーにとって便利で快適なものを使用します。 MooTools.Classまたは他の類似のライブラリにより、アプリケーションが読みやすくなり、サポートが容易になると思われる場合は、それを使用してください! そして、Java Scriptのイデオロギーについて叫ぶあなたが知っているすべての人に注意を払ってはいけません(そして間違いなく美しいです)
UPD:このトピックは、 aux メッセージへの応答として作成されました。
JSはプロトタイプOOPを説教します。クラス松葉杖を挿入することは意外ではありません。 言語とその機能を学びます。
フレームワークのアプローチが唯一の真のアプローチであるとは主張しません。 誰かがそれがJavascriptイデオロギーまたはそのようなものに準拠していないと言われた場合、MooTools.Classのようなラッパーを避けるべきではありません。 _