検索
ホームページウェブフロントエンドjsチュートリアルjsクラス継承の具体的な実装方法_基礎知識

コードをいじり始める前に、継承を使用する目的と利点を理解する必要があります。一般に、クラスを設計するときは、コードの繰り返しを減らし、クラス間の結合を弱めるように努めます。両方のバランスをとることは困難であり、具体的な条件や状況に応じてどのような方法をとるかを決定する必要があります。オブジェクト指向言語における継承の理解によれば、継承はクラスの直接的な強結合をもたらしますが、js はその独特の柔軟性により、強結合と弱結合、高効率と低効率のコードを設計できます。何を使うかは状況によって異なります。

js で継承を実装するには、クラス継承、プロトタイプ継承、メタクラスの 3 つの方法があります。ここでは最初にクラス継承について簡単に説明し、最後の 2 つについては後で簡単に説明します。ご理解とご指導をお願いいたします。

古典的な継承。

js クラスの継承の実装は、プロトタイプ チェーンに依存します。プロトタイプチェーンとは何ですか? js のオブジェクトには、prototype と呼ばれる属性があり、この属性はオブジェクト タイプへの参照を返し、オブジェクトのクラスの基本関数のセットを提供するために使用されます。

プロトタイプの印象があるようです ちなみに、こんなコードをよく使います。

コードをコピーします コードは次のとおりです:

var Person = function(){
this. name = "liyatang";
};
person.prototype = {
// Person の基本関数はここで提供できます
getName: function(){
return this .name;
}
}

クラスの基本関数をプロトタイプ属性に配置し、Person オブジェクトへの参照に XXX 関数があることを示します。

プロトタイプを理解した後は、プロトタイプ チェーンとは何かを理解する必要があります。オブジェクトのメンバー (プロパティまたはメソッド) にアクセスするときに、このメンバーが現在のオブジェクト内に見つからない場合、js は、prototype 属性が指すオブジェクト内でそのメンバーを検索します。まだ見つからない場合は、引き続き検索します。次のレベルのプロトタイプを、指定されたオブジェクトが見つかるまで検索します。見つからない場合は、unknown が返されます。

では、プロトタイプチェーンはどのようなヒントを与えてくれるでしょうか?プロトタイプ チェーンとは、あるクラスが別のクラスを継承するには、親クラスのインスタンスを指すようにサブクラスのプロトタイプを設定するだけでよいことを意味すると考えるのは簡単です。これにより、親クラスのメンバーが子クラスにバインドされます。子クラスでメンバーが見つからない場合は、親クラスで検索されるためです。 (上記 2 つの段落の文言は厳密なものではなく、わかりやすく説明したものです)

次に、中国語クラスが必要です。これは、Person クラスの name メンバーと getName メンバーを継承する必要があります。

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

var Chinese = function(name,nation) {
//継承、親クラスのコンストラクターを呼び出す必要があります。これは call で呼び出すことができます。これは中国語を指します
// person がこのスコープ内にある場合にのみ、person Person.call(this,name );
this.nation =nation;
};
Chinese.prototype = Person.prototype;
//これは以前と同じであることはできません。プロトタイプ属性は上書きされます
//中国語 .prototype = {
// getNation : function(){
// return this.nation;
// }
//};
//後続のメソッドはすべて次のように追加する必要があります
Chinese.prototype.getNation = function(){
return this.nation;
};

継承関係が確立されると、このように呼びます

コードをコピーします コードは次のとおりです。
var c = new Chinese("liyatang" ,"中国 ");
alert(c.getName());// liyatang

これでクラスの継承は完了です。本当に完了したのでしょうか? firebug を使用してアラートにブレークポイントを設定すると、元の Person.prototype が変更され、getNation メソッドが追加されていることがわかります。


jsクラス継承の具体的な実装方法_基礎知識

これは、上記のコードでは Chinese.prototype = Person.prototype; が参照型であるためです。これ自体は容認できず、クラス間に強い結合が生じますが、これは私たちが望む結果ではありません。

新しいオブジェクトを作成したり、インスタンスをインスタンス化して結合を弱めることができます。


コードをコピー コードは次のとおりです:
//最初のタイプ
//中国語。prototype = new Person();
//2 番目の型
//var F = function(){};
//F.prototype = Person.prototype;
//中国語。プロトタイプ = F.prototype;

これら 2 つの方法の違いは何ですか。 2 番目のタイプでは、空の関数 F が追加されます。これにより、親クラスのインスタンスの作成が回避されます。これは、親クラスが比較的大きい可能性があり、親クラスのコンストラクターに副作用が発生したり、大量の処理が実行されたりするためです。計算。したがって、2 番目の方法を強くお勧めします。

これで終わりです、まだ終わっていません!オブジェクトのプロトタイプ属性の下には属性コンストラクターがあり、特定のオブジェクト インスタンスを構築する関数への参照を保持します。このステートメントによると、Chiese.prototype.constructor は中国語と等しいはずですが、そうではありません。

Chiese のプロトタイプ チェーンをセットアップするときに、Chiese.prototype を person.prototype で上書きしたことを思い出してください。したがって、この時点の Chiese.prototype.constructor は person です。次のコードも追加する必要があります

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

//勉強する必要はありませんif 条件の詳細については、ご存知のとおり、 Chinese.prototype.constructor = Chinese
if( Chinese.prototype.constructor == Object.prototype.constructor){
Chinese.prototype.constructor = Chinese;
です。 }

すべてのコードを次のように整理します

コードをコピーします コードは次のとおりです:

var Person = function( name){
this.name = name;
};
Person.prototype = {
getName : function(){
return this.name;
}
} ;

var Chinese = function(name,nation){
person.call(this,name);
this.nation =nation;
};
var F = function (){};
F.prototype = person.prototype;
Chinese.prototype = F.prototype;
if( Chinese.prototype.constructor == Object.prototype.constructor ){
中国語 .prototype.constructor = Chinese;
}
Chinese.prototype.getNation = function(){
return this.nation;
};

var c = new Chinese(" liyatang","China");
alert(c.getName());

継承したコードを関数に配置してコードの再利用を容易にできる場合、最終的なコードは次のように構成されます

コードをコピーします コードは次のとおりです。

function extend(subClass,superClass){
var F = function(){};
F.prototype = superClass.prototype;
subClass.prototype = new F();
subClass.prototype.constructor = subClass;
サブクラス。 superclass = superClass .prototype; //親クラス関数を呼び出すために、親クラス自体を指す追加の属性を追加します
if(superClass.prototype.constructor == Object.prototype.constructor){
superClass .prototype.constructor = superClass;
}
}

var Person = function(name){
this.name = name;
};
Person.prototype = {
getName : function( ){
return this.name;
}
};

var Chinese = function(name,nation){
Person.call( this,name);
this.nation =nation;
};
extend(中国語, 人);
Chinese.prototype.getNation = function(){
return this.nation;
};

var c = new Chinese("liyatang","China");
alert(c.getName());

公開後に改訂されました:

1 階のコメントの下に、拡張機能に関する新しい見解があります。以前、プロトタイプ チェーンのセットアップ方法について議論したときに 2 つの方法が提案されました

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

//最初のタイプ
//中国語。prototype = new Person();
//2 番目の型
//var F = function(){};
//F.prototype = Person.prototype;
//中国語。プロトタイプ = F.prototype;

2 番目のメソッドは親クラスのコンストラクターを呼び出す必要性を減らしますが、中国語クラスの設計時に Person.call(this,name) が使用されました。これは親クラスのコンストラクターを呼び出すことと同じです。

ただし、最初の方法を使用すると、コードのこの部分はサブクラスで忘れられることがよくあります。この関数コードを extend に置くこともできます。

と書くだけです

Chinese.prototype = new Person(); も同じ目的を達成します。結合は強くありません。

しかし、忘れられているのは、 Chinese.prototype = new Person(); が正しく書かれていることです。答えはノーです!明らかに、 new Person() は name パラメータを渡す必要があります。この部分の作業は extend 関数では実行できないため、中国語クラスの親クラスのコンストラクターを呼び出す必要があります。これはオブジェクト指向の考え方とも一致しています。

したがって、やはり 2 番目の方法を使用することを強くお勧めします。

このような技術的な記事を書くのは初めてなので、基本的には自分の考えに基づいて開発していますが、考慮されていない部分や不明瞭な説明は避けられないと思います。フィードバック用のメッセージ、ありがとうございます。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
如何使用JS和百度地图实现地图平移功能如何使用JS和百度地图实现地图平移功能Nov 21, 2023 am 10:00 AM

如何使用JS和百度地图实现地图平移功能百度地图是一款广泛使用的地图服务平台,在Web开发中经常用于展示地理信息、定位等功能。本文将介绍如何使用JS和百度地图API实现地图平移功能,并提供具体的代码示例。一、准备工作使用百度地图API前,首先需要在百度地图开放平台(http://lbsyun.baidu.com/)上申请一个开发者账号,并创建一个应用。创建完成

如何使用JS和百度地图实现地图热力图功能如何使用JS和百度地图实现地图热力图功能Nov 21, 2023 am 09:33 AM

如何使用JS和百度地图实现地图热力图功能简介:随着互联网和移动设备的迅速发展,地图成为了一种普遍的应用场景。而热力图作为一种可视化的展示方式,能够帮助我们更直观地了解数据的分布情况。本文将介绍如何使用JS和百度地图API来实现地图热力图的功能,并提供具体的代码示例。准备工作:在开始之前,你需要准备以下事项:一个百度开发者账号,并创建一个应用,获取到相应的AP

js字符串转数组js字符串转数组Aug 03, 2023 pm 01:34 PM

js字符串转数组的方法:1、使用“split()”方法,可以根据指定的分隔符将字符串分割成数组元素;2、使用“Array.from()”方法,可以将可迭代对象或类数组对象转换成真正的数组;3、使用for循环遍历,将每个字符依次添加到数组中;4、使用“Array.split()”方法,通过调用“Array.prototype.forEach()”将一个字符串拆分成数组的快捷方式。

如何使用JS和百度地图实现地图多边形绘制功能如何使用JS和百度地图实现地图多边形绘制功能Nov 21, 2023 am 10:53 AM

如何使用JS和百度地图实现地图多边形绘制功能在现代网页开发中,地图应用已经成为常见的功能之一。而地图上绘制多边形,可以帮助我们将特定区域进行标记,方便用户进行查看和分析。本文将介绍如何使用JS和百度地图API实现地图多边形绘制功能,并提供具体的代码示例。首先,我们需要引入百度地图API。可以利用以下代码在HTML文件中导入百度地图API的JavaScript

js中new操作符做了哪些事情js中new操作符做了哪些事情Nov 13, 2023 pm 04:05 PM

js中new操作符做了:1、创建一个空对象,这个新对象将成为函数的实例;2、将新对象的原型链接到构造函数的原型对象,这样新对象就可以访问构造函数原型对象中定义的属性和方法;3、将构造函数的作用域赋给新对象,这样新对象就可以通过this关键字来引用构造函数中的属性和方法;4、执行构造函数中的代码,构造函数中的代码将用于初始化新对象的属性和方法;5、如果构造函数中没有返回等等。

用JavaScript模拟实现打字小游戏!用JavaScript模拟实现打字小游戏!Aug 07, 2022 am 10:34 AM

这篇文章主要为大家详细介绍了js实现打字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

php可以读js内部的数组吗php可以读js内部的数组吗Jul 12, 2023 pm 03:41 PM

php在特定情况下可以读js内部的数组。其方法是:1、在JavaScript中,创建一个包含需要传递给PHP的数组的变量;2、使用Ajax技术将该数组发送给PHP脚本。可以使用原生的JavaScript代码或者使用基于Ajax的JavaScript库如jQuery等;3、在PHP脚本中,接收传递过来的数组数据,并进行相应的处理即可。

js是什么编程语言?js是什么编程语言?May 05, 2019 am 10:22 AM

js全称JavaScript,是一种具有函数优先的轻量级,直译式、解释型或即时编译型的高级编程语言,是一种属于网络的高级脚本语言;JavaScript基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式,如函数式编程。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。