jsの抽象的な方法
8038 ワード
一.JavaScriptのクラスのパッケージJavascriptは対向言語ではなく、クラスに対するサポートを提供していないので、伝統的な言語のようにクラスを定義することはできませんが、jsのクローズドパッケージ機構を利用してjsクラスを実現できます.以下は簡単なShape類を封入して説明します.Shape Base「クラスの法則」を定義します.function ShappeBase(){this.show=function(){ShappeBase show];;this.init=function(){Shape Base init]];ここでは、varではなく、thisを用いて声明します.後者はプライベート方法を定義します.
2. [prototype ]
ShapeBase.prototype.show=function(){
alert("ShapeBase show");
}
ShapeBase.prototype.init=function(){
alert("ShapeBase init");
}
ShapeBase.prototype={
show:function(){
alert("ShapeBase show");
}
init:function(){
alert("ShapeBase init");
}
}
java , 。
funciton test(){
var s = new ShapeBase();
s.init();
s.show();
}
JS , java ,new , 。 var。
二.JS抽象類と継承類のパッケージはすでに実現しました.対象に向けた他のいくつかの優れた特性はJS自身の特性によっても実現できます.このような化は思想そのものに帰するのが1種の技巧です.JavaScript言語自体の性質を利用して、その抽象的なクラスを実現することができます.また、親のプロトタイプのメンバー方法をサブクラスのプロトタイプにコピーすることによって、その継承メカニズムを実現することもできます.オブジェクト指向プログラミングにおける継承概念は、javascript言語の関数属性コピーに変換されます.1.JSにおける例示的なprototype方法を実例化できるprototype方法Object.prototype.exted=function(object){return Object.exted.apply(this,object)}2.JSの虚構方法は伝統的な言語で虚構方法を定義しておきますが、虚構化方法は抽象化されません.虚法はこのクラスでは定義されていない方法として認識されていますが、すでにthisポインタによって使用されています.したがって、JSにおける虚法は声明を経て直接使用する必要がなく、クラスも実用化されます.静的方法:Object.exted=function(destination){for for(property in source)”3.1)【例示的方法prototype】Objectを例にとって、まずObjectのexted方法を定義し、1つは静的方法であり、1つは例示的方法であり、この2つの方法はprototypeによって実現される継承機構である.継承クラスRect function Rect()/////////////////継承Rect.prototypepe=ShappeBase.prototype.prototype「Rect add」)、「ここでの継承は、一般的な対象とは異なる継承特性があります.prototypeの割当値が単にアドレスを変更するだけで、「サブクラス」を書き換える方法であると、「親タイプ」という現象が起こります.という方法も変わってきました.このような権利移転には驚きました.テスト例は以下の通りです.ショー方法Rect.prototype.show=function(){alert show]; :
function test(){
var s = new ShapeBase();
// :Rect show
s.show();
// :Rect show
var r = new Rect();
// :Rect add
r.add();
}
3.2 [ ]
object.extend , oninit , “ ”ShapeBase :
ShapeBase.prototype = {
show:function(){
alert("ShapeBase show");
}
initialize:function(){
this.oninit();
}
}
Rect
Rect.prototype = (new ShapeBase).extend({
//
add:function(){
alert("Rect add");
},
// show
show:function(){
alert("Rect show");
},
//
oninit:function(){
alert("Rect oninit");
}
})
:
function test(src){
var s = ShapeBase();
// ShapeBase show[ ]
s.show();
var r = new Rect();
// Rect show [ ]
r.show();
// Rect add [ ]
r.add();
// Rect oninit [ oninit ]
r.initialize();
}
三.特定対象創建類特定対象実現属性コピーfunction exted(des,src){if(!des){des={}if(src){for(var i in src){des[i]=src[i];} return des;
}
//
var CC = {};
// create
CC.create = function(superclass,constructor){
var clazz = (function(){
this.initialize.apply(this,arguments);
});
// ,
if(arguments.length == 0){
return clazz;
}
// constructor ,
if(!superclass){
extend(clazz.prototype,constructor);
return clazz;
}
var absObj = clazz.prototype,
sprPropty = superclass.prototype;
if(sprProty){
//
clazz.superclass = prototype;
extend(absObj ,sprPropty);
// 。
extend(absObj, constructor(sprPropty));
// obj.superclass 。
// , 。
absObj.superclass = sprPropty;
clazz.constructor = constructor;
}
return clazz;
}
//
var Animal = CC.create(null ,{
//
footprint:‘-------------------=’,
// 。 new 。 //
initialize:function(options){
extend(this,options);
alert("Animal initialize method is called.");
}
eat:function(){
alert("Animal eat method is called");
}
move:function(){
alert("I am moving like this '+ this.footprint+' .");
}
});
// Duke
var Duke = CC.create(Animal,function(superclass){
// , 。
// ,
var static_instance_counter = 0;
function classUtilityFuncHere(){};
//
return{
//
initialize:function(){
alert("initializing Duke class");
}
// 。 。
superclass.initialize.call(this,options);
//
alert("Duke initialize method is called.");
//
static_instance_couter++;
},
// move Duke
move:function(){
this.footprint = this.footprint + "zzzzzzzzzzzzz";
superclass.move.call(this);
},
// eat , eat
eat:function(){
alert("Duke is eating");
},
// , Duke
say:function(){
alert("The number of Duke instance is ' + static_instance_counter' ");
}
};
});
var DukeChild = CC.create(Duke,function(superclass){
return{
move:function(){
this.footprint = this.footprint + "++++++=";
superclass.move.call(this);
},
say:function(){
alert("this.msg ||");
}
};
})
:
function test(){
var animal = new Animal();
animal.eat()
animal.move();
var dukeA = new Duke();
dukeA.eat();
dukeA.move();
dukeA.say();
var dukeB = new Duke();
dukeB.eat();
dukeB.move();
dukeB.say();
var dukeC = new DukeChild({msg:'I am a child of duke'});
duckC.move();
duckC.say();
}