javascriptのクラスの作成と継承


クラスの定義
クラス定義には三つの基本的な方法があります.
1、特定の種類のオブジェクトの関数(工場関数)を作成して返します.例えば、function Co(){var o=new Object;o.a=1 returno}このようにオブジェクトを作成します.var o=Co()
2、コンストラクタを作成し、newで具体化します.例えば、function Co(){this.a=1}はこのようにオブジェクトを作成します.var o=new Co()
3、原型の方式、対象のprototype属性を利用して、例えばfunction Co(){};Co.prototype.a=1このようにオブジェクトを作成します.var o=new Co()
この3つの方法を活用して組み合わせができます.
クラスの継承
クラスの継承には二つの基本的な方法があります.
1、オブジェクトを基本原理と偽る:構造関数はthisキーワードを使って、すべての属性と方法に値を付ける(構造関数は実際には賦値関数だけ)ので、クラスの内部で直接赋値関数を実行して、そのthisキーワードを新しいクラスに渡す方法を利用することができます.たとえば:
var a = function(){        this.a = 1;        this.b = 2;        alert(this);    }       var b = function(){        this.aa = a;// a this ,         this.aa();        delete this.aa;  // ,            //         a.call(this,arg1,arg2);        //         a.apply(this,[args]);    }       var ob = new b();      var a = function(){     this.a = 1;     this.b = 2;     alert(this); } var b = function(){     this.aa = a;// a this ,     this.aa();     delete this.aa;  // ,     //     a.call(this,arg1,arg2);     //     a.apply(this,[args]); } var ob = new b();    

2、

: , (http://www.javaeye.com/topic/53537) prototype , , , , 。

prototype.js

prototype.js1.4

prototype-1.4.0

1.6.0 :

/** obsolete syntax **/     var Person = Class.create();    // Class.create     Person.prototype = {               // prototype , , initalize       initialize: function(name) {         this.name = name;       },       say: function(message) {         return this.name + ': ' + message;       }     };        var guy = new Person('Miro');     guy.say('hi');     // -> "Miro: hi"                                                 //prototype :    var Pirate = Class.create();    // ;    // inherit from Person class:     Pirate.prototype = Object.extend(new Person(), {    // , ,      // redefine the speak method                               // , prototype     say: function(message) {                                       // intilize ,         return this.name + ': ' + message + ', yarr!';      // prototype ,       }                                                                        // 。    });        var john = new Pirate('Long John');     john.say('ahoy matey');     // -> "Long John: ahoy matey, yarr!"   /** obsolete syntax **/  var Person = Class.create();    // Class.create Person.prototype = {               // prototype , , initalize   initialize: function(name) {      this.name = name;    },    say: function(message) {      return this.name + ': ' + message;    }  };  var guy = new Person('Miro');  guy.say('hi');  // -> "Miro: hi"                                              //prototype : var Pirate = Class.create();    // ; // inherit from Person class:  Pirate.prototype = Object.extend(new Person(), {    // , ,   // redefine the speak method                               // , prototype say: function(message) {                                       // intilize ,     return this.name + ': ' + message + ', yarr!';      // prototype ,   }                                                                        // 。 });  var john = new Pirate('Long John');  john.say('ahoy matey');  // -> "Long John: ahoy matey, yarr!"

Class.create

var Class = {      create: function() {        return function() {                                          // intiliaze ( ) ,          this.initialize.apply(this, arguments);              //         }      }    }              var Class = {   create: function() {     return function() {                                          // intiliaze ( ) ,       this.initialize.apply(this, arguments);              //     }   } }    

prototype , , 。

prototype-1.6.0 :

Java

1.6.0 , prototype , :

/** new preferred syntax **/    // properties エリア ディレクトリー passed ト `create` method     var Person = クレス.       initialize: function(name) {                       // のクラスを する はありません.そして、 の が わります.        this.name = name       },       say: function(message) {         return this.name + ': ' + メッセージ       }     });       // when subclassing、 specify the クラス あなた want ト inheit from     var Pirate = Class.creat(Person、 {            // つ のパラメータはクラスで、クラスを する はクラスを えて します.      // redefine the speak method     say: function($super) メッセージ {         return $super(message) + ', ヤrr       }     });        var ジョン = new Pirate('Long) ジョン     john.say('aboy) matiey;    // -> “Long” ジョン: アホー matiey、 ヤrr   
1.6.0 、prototypeのクラスをより く した :/** new preferred syntax **/ // properties エリア ディレクトリー passed ト `create` method  var Person = クレス.    initialize: function(name) {                       // のクラスを する はありません.そして、 の が わります.    this.name = name    },    say: function(message) {      return this.name + ': ' + メッセージ    }  }); // when subclassing、 specify the クラス あなた want ト inheit from  var Pirate = Class.creat(Person、 {            // つ のパラメータはクラスで、クラスを する はクラスを えて します.  // redefine the speak method  say: function($super) メッセージ {      return $super(message) + ', ヤrr    }  });  var ジョン = new Pirate('Long) ジョン  john.say('aboy) matiey; // -> “Long” ジョン: アホー matiey、 ヤrr
されたコードは ですが、 は1.60 のバージョンとほぼ じです.オブジェクトを ってinitialize を し、プロトタイプチェーンで を する です.
はサブクラスの 、サブクラスのinitializeを き えます.
1.60 var アニマル = Class.creat();     Animal.prototype = {       initialize: function(name sound) {                                 //クラスを えて、 の つのパラメータ        this.name = name         this.sound = sound;       },                     speak: function() {     alert(name) + 「 says: " + sound + "!");     }     };        var スネーク = new アニマル(「Ringneck」、 "ヒssssss";     snake.speak()    // -> alerts 「Ringneck says: ヒssssss!」        var Docg = Class.creat();        Docg.prototype = Object.exted(new アニマル() {     initialize: function(name) { //サブクラス、パラメータを します.    this.name = name     this.sound = 「woof」     }     });        var fido = new ドッグ(「Fido」)     fido.speak()    // -> alerts 「Fido says: woof!”     var アニマル = Class.creat();  Animal.prototype = {    initialize: function(name sound) {                                 //クラスを えて、 の つのパラメータ    this.name = name      this.sound = sound;    },                speak: function() {  alert(name) + 「 says: " + sound + "!");  }  };  var スネーク = new アニマル(「Ringneck」、 "ヒssssss";  snake.speak() // -> alerts 「Ringneck says: ヒssssss!」  var Docg = Class.creat();  Docg.prototype = Object.exted(new アニマル() {  initialize: function(name) { //サブクラス、パラメータを します. = name  this.sound = 「woof」  }  });  var fido = new ドッグ(「Fido」)  fido.speak() // -> alerts 「Fido says: woof!”
1.60
var アニマル = クレス.       initialize: function(name sound) {         this.name = name         this.sound = sound;       },                      speak: function() {     alert(this.name) + 「 says: " + this.sound + "!");     }     });    // subclassing アニマル     var スネーク = Class.reat(Animal、 {     initialize: function($super) name { //スーパークラスのinitliazeをSuperで び すと、     $super(name) 'ヒssssss;;     }     });     var リングネル = new Snake(「Ringneck」)     ringneck.speak()    //-> alerts "Ringneck says: ヒssssss!」        var ラットスネーク = new スネーク(「Rattler」)     rattlesnake.speak()    //-> alerts 「ラッタ says: ヒssssss!」       // mixing-inn Eumerable     var アニマルピーン = Class.creat(Enumerable、 {     initialize: function() {     var アークス = $A(argments)     if (!args.all( function(arg) { return arg instance of アニマル }))     throw 「Only」 アニメーション in here!"   this.animls = アークス     },       // implement _each ト アメリカ Eumerable methods     _each: function(iterator) {     return this.animls.ueach;     }     });    var snakePen = new アニマルピーン(ringneck) rattlesnake     snake Pen.invoke('speak')    //-> alerts 「Ringneck says: ヒssssss!」    //-> alerts 「ラッタ says: ヒssssss!」                 var アニマル = クレス.    initialize: function(name sound) {      this.name = name      this.sound = sound;    },             speak: function() {  alert(this.name) + 「 says: " + this.sound + "!");  }  }); // subclassing アニマル  var スネーク = Class.reat(Animal、 {  initialize: function($super) name { //スーパークラスのinitliazeをSuperで び すと、  $super(name) 'ヒssssss;;  }  });  var リングネル = new Snake(「Ringneck」)  ringneck.speak() //-> alerts "Ringneck says: ヒssssss!」  var ラットスネーク = new スネーク(「Rattler」)  rattlesnake.speak() //-> alerts 「ラッタ says: ヒssssss!」 // mixing-inn Eumerable  var アニマルピーン = Class.creat(Enumerable、 {  initialize: function() {  var アークス = $A(argments)  if (!args.all( function(arg) { return arg instance of アニマル }))  throw 「Only」 アニメーション in here!「this.animls」 = アークス  }, // implement _each ト アメリカ Eumerable methods  _each: function(iterator) {  return this.animls.ueach;  }  }); var snakePen = new アニマルピーン(ringneck) rattlesnake  snake Pen.invoke('speak') //-> alerts 「Ringneck says: ヒssssss!」 //-> alerts 「ラッタ says: ヒssssss!」