ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript はプロトタイプの継承を使用してオブジェクト system_javascript スキルを実装します

JavaScript はプロトタイプの継承を使用してオブジェクト system_javascript スキルを実装します

WBOY
WBOYオリジナル
2016-05-16 18:31:36881ブラウズ

JavaScript では、オブジェクトにはプロトタイプがありませんが、コンストラクターにはプロトタイプ
があります。プロトタイプの意味は次のとおりです。コンストラクターにプロトタイプ オブジェクト A がある場合、コンストラクターによって作成されたインスタンスは A

からコピーされる必要があります。 コードをコピーします コードは次のとおりです:

/*2 つのコンストラクターを宣言*/
var flowers=function( ){
this.name="nokia";
}
var flowers2=function(){
this.age=22;
/*プロトタイプ チェーン*/
flower2.prototype=newflower();
/*先ほどのプロトタイプの定義によれば、インスタンス obj は new flowers();*/
obj=new flowe2(); >/*親クラスのプロパティから継承*/
alert(obj.name); //==>"nokia"
alert(obj.age); //==>22


コンストラクター コンストラクターによって生成されたインスタンスのコンストラクター属性は、デフォルトで常にコンストラクターを指します
alert(obj.constructor);//==>flower
インスタンスのコンストラクター属性コンストラクター プロトタイプはコンストラクター自体を指します
alert(flower.prototype.constructor==flower);//==>true
コンストラクターはプロトタイプの継承と競合します


function flowers(){}
function flowers2(){}
flower2.prototype =new flowers();
var obj1=new flowers();
var obj2=new flowers2();
/*両方のインスタンスのコンストラクター属性がflowerを指していることが問題になります*/
alert(obj1.constructor==obj2.constructor);
/*obj1 と obj2 は異なるコンストラクターによって生成されたインスタンスであり、同じコンストラクターを指しています。明らかに問題があります*/


解決策


flower2.prototype=new flowers() ;
/*プロトタイプをリセットした後、プロトタイプのコンストラクター プロパティを変更します*/
flower2.prototype.constructor=flower2
インスタンスを構築するたびにコンストラクター プロパティをオーバーライドします
function flowers2(){
this.constructor=arguments.callee;
}
flower2.prototype=new flowers();


さらに、プロトタイプの継承では親クラスを呼び出すメソッドが提供されません。
ただし、プロトタイプの継承に基づいており、この欠陥を補うために、静的変数を通じて親クラスを記録します


コードをコピーします コードは次のとおりです。
var Class={
create :function()
{
var _class=function()
{
this.init.apply(this,arguments);
_class.prototype.init=関数.
try{
return _class; _class=null;
}
}
};
//デフォルトのコンストラクター
Function.prototype.init=function(){}
//メソッド拡張
関数。 prototype.extend=function(list)
{
for(var i in list)this.prototype [i]=list[i]
return this;
}
//Multi -level継承
Function.prototype.inherits=function(parent)
{
//継承深さレベル
var _ Depth=0>//メソッド属性移植
this.extend; (newparent());
//初期化コンストラクタークラスの継承は、通常、コンストラクターを継承しません
this.prototype.init=Function.prototype.init;
//クラスの静的親クラス
this.parent=parent;
//親クラス関数を実行します
this.prototype.parent= function(name)
{
//パラメータがない場合はコンストラクタを実行します
if(!name)name='init';
//実行される親クラス
var _parent=parent; //現在親クラスで実行されている場合は、引き続き検索します。スーパークラス
if(_ Depth)
{
for(var i=0;i<_ Depth;i )
{
_parent=_parent.parent
} }
//レベルを設定します
_ Depth;
try{
//関数を実行して値を返します
return _parent.prototype[name].apply(this,Array.prototype) .slice.apply(arguments,[1]));
}catch(e){
throw(e);
}finally {
//回復レベル
_ Depth--;
}
}
これを返します;
}


例:




コードをコピー

コードは次のとおりです。
c:100
}); "object" (コンストラクター)
var s=new class1();
s.b();// ==>"clas",100


親クラスを継承して呼び出します親クラスのメソッド:




コードをコピーします


コードは次のとおりです:

var test=Class.create().inherits(class1).extend({
b:function()
{
alert('test');
this.parent('b')
},
c:110
});
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。