検索
ホームページウェブフロントエンドjsチュートリアルJavaScriptコードの再利用パターンを詳しく解説_基礎知識

コードの再利用とその原則

<font face="NSimsun">代码复用</font> は、その名前が示すように、新しいプログラムを構築するために書かれたコードの一部または全部を再利用することです。コードの再利用について話すとき、最初に思い浮かぶのは <font face="NSimsun">继承性</font> です。コード再利用の原則は次のとおりです:

<code>优先使用对象组合,而不是类继承</code>

js にはクラスの概念がないため、インスタンスの概念はあまり意味がありません。js のオブジェクトは単純なキーと値のペアであり、動的に作成および変更できます。

しかし、<font face="NSimsun">js</font> では、コンストラクターと <font face="NSimsun">new</font> 演算子を使用してオブジェクトをインスタンス化できます。これには、クラスを使用する他のプログラミング言語と構文の類似点があります。

例:

<code>var trigkit4 = new Person();</code>

<font face="NSimsun">js</font> は、コンストラクター <font face="NSimsun">Person</font> を呼び出すとクラスのように見えますが、実際には関数です。これにより、クラスに基づいて呼び出すことができるいくつかの開発アイデアと継承パターンが得られます。 「クラス継承パターン」。

従来の継承モードには <font face="NSimsun">class</font> キーワードが必要です。上記のクラス継承モードは、クラスの観点から考慮する必要のないモードである <font face="NSimsun">现代继承模式</font> であると仮定します。

クラス継承パターン

次の 2 つのコンストラクター <font face="NSimsun">Parent()</font><font face="NSimsun">Child()</font> の例を見てください。

<code><script type="text/javascript"><br />    function Parent(name){<br />        this.name = name || 'Allen';<br />    }<br />    Parent.prototype.say = function(){<br />        return this.name;<br />    }<br />    function Child(name){}<br />    //用Parent构造函数创建一个对象,并将该对象赋值给Child原型以实现继承<br />    function inherit(C,P){<br />        C.prototype = new P();//原型属性应该指向一个对象,而不是函数<br />    }<br />    //调用声明的继承函数<br />    inherit(Child,Parent);<br /></script></code>

ステートメントを使用してオブジェクトを作成すると、次のようなプロトタイプを介して <font face="NSimsun">new Child()</font> インスタンスからその機能が取得されます。 <font face="NSimsun">Parent()</font>

<code>var kid = new Child();
kid.say();
//Allen</code>
プロトタイプチェーン

クラス継承モデルでプロトタイプ チェーンがどのように機能するかについて説明します。このメモリ ブロックには、データと他のブロックへの参照が含まれるブロックとして考えられます。

ステートメントを使用してオブジェクトを作成すると、下図の左側のようなブロックが作成されます。

メソッドにアクセスする場合は、このブロックに <font face="NSimsun">new Parent()</font> 属性が保存されます。コンストラクター <font face="NSimsun">name</font> を指す (プロトタイプ) 属性の暗黙リンク <font face="NSimsun">say()</font> は、右側のブロック <font face="NSimsun">Parent()</font> にアクセスできます。 <font face="NSimsun">prototype</font> <font face="NSimsun">__proto__</font><font face="NSimsun">Parent.prototype</font>

では、 を使用して新しいオブジェクトを作成するとどうなるでしょうか?以下に示すように:

<font face="NSimsun">var kid = new Child()</font>

ステートメントを使用して作成されたオブジェクトは、暗黙的なリンク

を除いてほとんど空です。この場合、

は、<font face="NSimsun">new Child()</font> 関数の <font face="NSimsun">__proto__</font> ステートメントを使用して作成されたオブジェクト <font face="NSimsun">__proto__</font> を指します。 <font face="NSimsun">inherit()</font><font face="NSimsun">new Parent()</font> を実行すると、左下のブロック オブジェクトには

メソッドがないため、プロトタイプ チェーンを通じて中央のブロック オブジェクトをクエリします。ただし、中央のブロック オブジェクトには メソッドのいずれかであるため、プロトタイプ チェーンに従って右端のブロック オブジェクトをクエリしたところ、このオブジェクトにはたまたま

メソッドが含まれていました。もう終わりですか? <font face="NSimsun">kid.say()</font> <font face="NSimsun">say()</font> は、ここで実行された時点では終了していません。<font face="NSimsun">say()</font> メソッド内で参照されているのは、<font face="NSimsun">say()</font> ブロックです。このため、中央のブロックがクエリされ、中央のブロックはたまたま

属性を持ちます。この時点で、プロトタイプ チェーンのクエリは完了します。

<font face="NSimsun">say()</font>より詳細な議論については、私の記事を参照してください: <font face="NSimsun">this.name</font>JavaScript 学習ノート (5) プロトタイプとプロトタイプ チェーンの詳細な説明<font face="NSimsun">new Child()</font><font face="NSimsun">new Child()</font> <font face="NSimsun">name</font><font face="NSimsun">name</font>プロトタイプを共有

このパターンのルールは、再利用可能なメンバーはプロトタイプに配置するのではなく、プロトタイプに転送する必要があるということです。したがって、継承の目的では、継承する価値のあるものはすべてプロトタイプに実装する必要があります。したがって、次の例に示すように、子オブジェクトのプロトタイプを親オブジェクトのプロトタイプと同じに設定できます。

<code>function inherit(C,P){<br>    C.prototype = P.prototype;<br>}</code>

子对象和父对象共享同一个原型,并且可以同等的访问<font face="NSimsun">say()</font>方法。然而,子对象并没有继承<font face="NSimsun">name</font>属性

原型继承

原型继承是一种“现代”无类继承模式。看如下实例:

<code><script type="text/javascript"><br />    //要继承的对象<br />    var parent = {<br />        name : "Jack"  //这里不能有分号哦<br />    };</script></code>
<code>    //新对象<br>    var child = Object(parent);</code>
<code>    alert(child.name);//Jack<br></code>

在原型模式中,并不需要使用对象字面量来创建父对象。如下代码所示,可以使用构造函数来创建父对象,这样做的话,自身的属性和构造函数的原型的属性都将被继承。

<code><script type="text/javascript"><br />    //父构造函数<br />    function Person(){<br />        this.name = "trigkit4";<br />    }<br />    //添加到原型的属性<br />    Person.prototype.getName = function(){<br />        return this.name;<br />    };<br />    //创建一个新的Person类对象<br />    var obj = new Person();<br />    //继承<br />    var kid = Object(obj);<br />    alert(kid.getName());//trigkit4<br /></script></code>

本模式中,可以选择仅继承现有构造函数的原型对象。对象继承自对象,而不论父对象是如何创建的,如下实例:

<code><script type="text/javascript"><br />    //父构造函数<br />    function Person(){<br />        this.name = "trigkit4";<br />    }<br />    //添加到原型的属性<br />    Person.prototype.getName = function(){<br />        return this.name;<br />    };<br />    //创建一个新的Person类对象<br />    var obj = new Person();<br />    //继承<br />    var kid = Object(Person.prototype);<br />    console.log(typeof kid.getName);//function,因为它在原型中<br />    console.log(typeof kid.name);//undefined,因为只有该原型是继承的<br /></script></code>

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript的Symbol类型、隐藏属性及全局注册表详解JavaScript的Symbol类型、隐藏属性及全局注册表详解Jun 02, 2022 am 11:50 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

原来利用纯CSS也能实现文字轮播与图片轮播!原来利用纯CSS也能实现文字轮播与图片轮播!Jun 10, 2022 pm 01:00 PM

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

整理总结JavaScript常见的BOM操作整理总结JavaScript常见的BOM操作Jun 01, 2022 am 11:43 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach是es6里的吗foreach是es6里的吗May 05, 2022 pm 05:59 PM

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

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ヘンタイを無料で生成します。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境