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!」