この記事では、継承に関するJavaScriptの使用をまとめたものです。参照のためにそれを共有してください。詳細は次のとおりです。
例:
次のようにコードをコピーします:/**
*実装サブクラスは親クラスを継承しますが、不要なプロパティと方法を生成しません
* @returns {function}
*/
定義(function(){
return function(subtype、supertype){
var proto = new object(supertype.prototype);
proto.constructor = subtype;
subtype.prototype = proto;
};
});
// - - - - - - - - - - - - 、、、、、、、、、...
定義(function(){
関数ostring(s)
{
this.str = s;
this.length = this.str.length;
}
ostring.prototype.show = function(){
アラート(this.str);
};
オストリングを返します。
});
// - - - - - - - - - - - - 、、、、、、、、、...
定義(['継承'、 'ostring']、function(enternit、ostring){
関数wstring(s){
//親クラスコンストラクターへの呼び出しを使用します
ostring.call(this、s);
this.chlength = 2 * s.length;
}
//他の属性を継承します
継承(wstring、ostring);
wstring.prototype.add = function(w)
{
アラート(this.str + w);
};
wstringを返します。
});
もう一度例を見てください
1。関数を使用して実装してください。
次のようにコードをコピーします:function person(name){
this.name = name;
}
person.prototype.getName = function(){
this.nameを返します。
}
関数著者(名前、本){
this.inherit = person;
this.inherit(name);
this.books = books;
}
var au = new Author( "dororo"、 "regan");
au.name
または同等:
次のようにコードをコピーします:function person(name){
this.name = name;
}
person.prototype.getName = function(){
this.nameを返します。
}
関数著者(名前、本){
person.call(this、name);
this.books = books;
}
var au = new Author( "dororo"、 "regan");
au.getName
これはこれをパラメーターにしているだけで、親クラスのコンストラクターを呼び出し、親クラスに割り当てられたすべてのドメインを著者サブクラスに割り当てているため、親クラスのコンストラクターの外側に定義されているドメインは継承されません。したがって、上記の例では、getNameが個人のプロトタイプオブジェクトで定義されているため、au.getNameは定義されません(未定義)。
さらに、サブクラスのコンストラクターは、親クラスによるサブクラスの定義を上書きしないように、独自のドメインを定義する前に親クラスコンストラクターを呼び出す必要があります。言い換えれば、著者はPerson.callの後のプロパティブックを定義します。それ以外の場合は、プロパティによって上書きされます。同時に、サブクラスが新しくインスタンス化された後、プロトタイプを実行する必要があり、親クラスのコンストラクターが呼び出されるため、プロトタイプを使用してサブクラスのサブクラスの関数ドメインを定義しないことをお勧めします。
2。プロトタイプを使用して実装してください。
次のようにコードをコピーします:function person(name){
this.name = name;
}
person.prototype.getName = function(){
this.nameを返します。
}
関数著者(名前、本){
this.books = books;
}
著者.prototype = new person(name);
著者.prototype.constructor =著者;
著者.prototype.getbooks = function(){
this.booksを返します。
}
var au1 = new Author( "dororo1"、 "regan 'neck");
var au2 = new Author( "dororo2"、 "Learn Less");
alert(au1.getname());
alert(au2.getname());
この方法は、プロトタイプが機能の実装で継承できない問題を回避します。 author.prototype = new person(name); new Person()インスタンスは、個人構成とプロトタイプのすべてのプロパティを呼び出します。しかし、不利な点は、author.prototypeがインスタンス化されていることです。したがって、サブクラスがインスタンス化されると、すべての非ベースデータ型は参照コピーです。したがって、上記の例では、例のAU1またはAU2で返される値はDororo1です。
3.「ハイブリッド」を使用して達成します
次のようにコードをコピーします:function person(name){
this.name = name;
}
person.prototype.getName = function(){
this.nameを返します。
}
関数著者(名前、本){
this.base = new person(name);
for(this.baseのvarキー){
if(!this [key]){
この[key] = this.base [key];
}
}
this.book = books;
}
var au1 = new Author( "dororo1"、 "work");
var au2 = new Author( "dororo2"、 "play");
alert(au1.getname());
alert(au2.getname());
au1.book;
au2.book;
拡張機能に属し、親クラスのすべてのドメインをサブクラスにコピーします。上記の2つの側面には問題はまったくありません。
寄生的な組み合わせモード)
JS継承には、属性の継承と方法の継承が含まれ、これらは異なる方法で実装されます。
1。属性の継承
属性の継承は、関数の実行環境を変更することにより達成されます。関数の変更の実行環境は、2つの方法を使用して実装できます:call()とapply()。
最初に動物の「クラス」を作成します(JSにクラスの概念がないため、ここには単なる模擬であり、実際には単なる関数関数オブジェクトです)。
次のようにコードをコピーします:function animal(typename){
//現在の方法の実行環境にプロパティタイプネームを追加する(これ)
//しかし、実行環境(これ)を決定する前に実行する必要があります
this.typename = typename;
this.colors = ["red"、 "while"];
}
//関数のプロトタイプに2つの(オブジェクト共有)メソッドを追加したい
Animal.prototype.shout = function(){alert( "i am: - " + this.typename);};
Animal.prototype.eat = function(){alert( "i am: - " + this.typename)};
//-ライオンを定義する - 「クラス」(実際には関数)
function lion(TN){
//-動物の方法を実行し、適用の最初のパラメーターを使用して動物の実行環境をこのライオンに変更します
//同様に、ライオンのこれは、それが誰であるかを判断するために実行する必要があります
animal.apply(this、["lion"]); //-親クラスの変数属性を継承します。これは新しいライオンだからです。これはライオンです
}
lion.prototype = animal.prototype; //親クラスのメソッドを継承し、それを完了しますが、これはよく書かれていません。チャイルドクラスがメソッドを追加すると、親クラスにもこの方法があります。これはポインターリファレンスです
lion.prototype.hunt = function(){
アラート(「私は:ライオン、私は狩りをしたい~~ ・〜」);
}
var aminm = new Animal();
aminm.hunt(); // ---サブクラスメソッドにアクセスできますが、これは良くありません
// ----では、この問題を解決する方法は? ? ? ? ? ?
// ---解決策:メソッドを継承するときにこれを書くことができます。
lion.prototype = new Animal(); //親クラスメソッドを継承し、動物オブジェクトをプロトタイプのプロトタイプに割り当てます。実際、属性も含まれています。
var lion = new lion(); //新しいキーワードの作成に加えて、ライオンオブジェクトの実行環境をライオンオブジェクト自体に変更します
// ---言い換えれば、新しいものが終了した後、これはライオン関数自体であり、ライオン関数は呼び出されます
新しいキーワードを分析します:
新しいキーワードはとても素晴らしいです。前のコードでは、新しいキーワードが次のタスクを完了します。
1)ライオンオブジェクトを保存する準備のためにヒープスペースを開く
2)ライオン関数のこれがライオン関数オブジェクト自体を指すように、ライオンオブジェクト自体の実行環境を変更します。
3)ライオン「クラス」の「コンストラクター」を呼び出し、ライオンオブジェクトを作成します
4)ライオン関数オブジェクトのヒープアドレスを変数Lに割り当て、この時点でLはライオン関数オブジェクトを指します
lion.shout();
lion.eat();
ただし、この継承には欠点があります。親クラスのコンストラクターは2回呼び出され、1回電話をかけてから、再び新しい呼び出します。
この記事がみんなのJavaScriptプログラミングに役立つことを願っています。