まず例を見てみましょう:
varクラス = {
create : function () {
return function () {
this.initialize.apply(this, argument)
}
}
}
var A = Class.create( );
A.prototype = {
initialize:function(){
//todo
}
test:"abc"
}
var a = new A( );
これは、多くの jser でクラスを構築し、オブジェクトをインスタンス化するプロセスであることに気づくでしょう: インスタンス化された a には追加の初期化メソッドがあります。インスタンス化中に initialize をプロキシとして使用すると、インスタンス化後は意味がなく、場合によっては不要なトラブルが発生します。たとえば、for...in ステートメントが a を通過するときに、initialize メソッドが通過することになります。
私が最初に考えたのは、前のブログ投稿で書かれた Class.js を使用することでした。これは非常にきれいです。ただし、Class.js の継承メカニズムにはいくつかのバグがあります。侵入せずに (つまり、プロトタイプを変更したり追加の属性を生成したりせずに) インターフェイスを実装することはさらに困難です。そこで、new 演算子をカプセル化することを考えました。この利点は、最初にプロトタイプを変更でき、new をカプセル化する方法で、継承とインターフェイスを実装でき、追加の属性を削除できることです。
まず、新しい演算子の簡単な実装を実装しましょう:
function New(){//new はキーワードなので区別してください。
var as = [],args = argument;
for(var i=1;i
as.push('args[' i ']');
}
nobj = eval("new args[0](" as.join(",") "); ") ;
return nobj;
}
次にテストします:
function A(n){ this.name = n;}
var a1 = new A('ts');
alert(a1.name);//ts
var a2 = New(A,'tangoboy');
alert(a2.name);//tangoboy
テストは成功しました。 New メソッドは基本的に、new 演算子の代わりにオブジェクトをインスタンス化できます。
この記事の冒頭にある初期化の問題を解決するのは非常に簡単です。
function New(){
var as = [],args = argument;
for(var i=1) ;ias.push('args[' i ']');
}
nobj = eval("new args[0](" as.join() ",") " );");
delete nobj.initialize;//インスタンス化されたオブジェクトのメソッドを削除します
return nobj;
}
次のセクションが始まります新しいメソッドを強化します。