目次
プロトタイプとプロトタイプ チェーン
コンストラクターにはアクセスできます
継承はプロトタイプチェーンを通じて実現されます
ES6 クラス class
ホームページ ウェブフロントエンド jsチュートリアル JavaScriptのプロトタイプチェーンによる継承分析(コード添付)

JavaScriptのプロトタイプチェーンによる継承分析(コード添付)

Aug 27, 2018 am 10:17 AM
html5 javascript

この記事の内容は、JavaScript でのプロトタイプチェーンによる継承の分析に関するものです (コード付き)。必要な方は参考にしていただければ幸いです。

プロトタイプとプロトタイプ チェーン

プロトタイプは、新しい関数を作成するときに自動的に生成され、プロトタイプには、プロトタイプを作成した関数オブジェクトを参照するコンストラクターも存在します。

__proto__ は、オブジェクトまたはインスタンスに組み込まれた [[prototype]] であり、オブジェクトを生成したオブジェクトのプロトタイプを指します。__proto__ は、アクセスできるようにブラウザーで提供されます。これは、 のポインティングによって形成されます。 __proto__ のチェーンはプロトタイプ チェーンと呼ばれます。プロトタイプ チェーンのリンク全体は次のとおりです: インスタンス オブジェクト- ->コンストラクターのプロトタイプ- ->オブジェクトのプロトタイプ- ->null

オブジェクトのプロパティまたはメソッドにアクセスするとき、最初にこのオブジェクトから検索します。プロパティまたはメソッドがこのオブジェクトに存在しない場合は、プロパティまたはメソッドが見つかるまでプロトタイプ チェーンに沿って上方向に検索します。ヌルストップに達します。

これは、配列オブジェクトにプッシュ、ポップ、シフト、アンシフトなどのメソッドがない理由も説明していますが、

コンストラクターにはアクセスできます

コンストラクター属性は、関数 (オブジェクト) を生成した関数 (オブジェクト) を指します)、

var a = function(){};
var b = new a();
var c = {};
var d = [];
//以下皆为true
console.log(b.constructor === a) //因为实例b是由构造函数产生的
console.log(a.constructor === Function)//函数a实际是Function的实例,同理
console.log(c.constructor === Object)//空对象c是Object的实例
console.log(d.constructor === Array)//空对象c是Object的实例
console.log(Object.constructor === Function)//Object自身就是一个构造函数,同理
console.log(Array.constructor === Function)//Array自身也是一个构造函数
//---------------------------------------------------------------
//首先__proto__指向的是产生该对象的对象的prototype,
//也即a.prototype,prototype中也的constructor,回指创建该prototype的函数对象,也即函数a
console.log(b.__proto__.constructor === a)
ログイン後にコピー

など ちなみに、instanceof、AinstanceofBは、Aのプロトタイプチェーンの中でBのプロトタイプを見つけることです。 見つかった場合はtrueを返し、見つからない場合はfalseを返します

//有个奇怪的现象,下面都返回true,这是为什么呢?
//因为JS中一切都继承自Object,除了最顶层的null,
//所以在Function的原型链中能找到Object.prototype
console.log(Function instanceof Object)
//而Object自身就是一个构造函数,因此在Object的原型链中也能找到Function.prototype
console.log(Object instanceof Function)
ログイン後にコピー

継承はプロトタイプチェーンを通じて実現されます

上記の分析から、プロトタイプチェーンは継承のロジックを実装することができます。継承はオブジェクト指向において非常に重要な概念です

function Dog(name){
    this.name = name;
    this.say1 = function(){
        console.log(this.name)
    }
}
Dog.prototype.say2 = function(){
    console.log(this.name)
}
Dog.prototype.test = 1
//say本来应该是所有Dog实例的共有方法,
//如果放在构造函数中,那么就会导致没办法数据共享,每一个实例都有自己的属性和方法的副本,这是对资源的极大浪费
//如果放在Dog.prototype中,那么利用原型链的特性,就可以让所有实例共用一个方法,
//需要注意的是,由于共用了一个方法,对属性的更改是对所有实例透明的

var dog1 = new Dog('lalala'); 
let dog2 = new Dog('wahaha');
dog1.test++;//2
dog2.test++;//3
console.log(dog1.say1 === dog2.say1)// false
console.log(dog1.say2 === dog2.say2)// true



//现在,我们可以尝试着去实现继承了
//我们是通过原型链去实现继承的,
//之前的原型链是:Dog实例 --> Dog函数 --> Object --> null
//那么现在的原型链需要改成 Dog实例 --> Dog函数 --> Dog父类(Animal函数) --> Object --> null
//第一种方案,改变Dog函数的prototype,让他指向Animal的实例
function Animal(){
    this.species = 'unknown';
}
Dog.prototype = new Animal();
//这里改变后会导致prototype中的constructor改变
Dog.prototype.constructor = Dog;

//第二钟方案,改变Dog函数的prototype,让他指向Animal的prototype
function Animal(){}
Animal.prototype.species = 'unknown';
Dog.prototype = Animal.prototype;
//这里改变后会导致prototype中的constructor改变
Dog.prototype.constructor = Dog;

//第三种方案,调用apply或call,将Animal的this绑定到Dog中
function Animal(){
    this.species = 'unknown';
}
function Dog(name){
    Animal.apply(this, arguments);
    this.name = name;
}

//第四种方法,通过Object.create()方法实现继承,过滤掉了父类实例属性,Dog.prototype中就没有了Animal的实例化数据了
//这种方法也是ES6中Class被babel编译成ES5所用的方法
function Animal(){
    this.species = 'unknown';
}
function Dog(name){
    Animal.apply(this, arguments);
    this.name = name;
}
//这里模拟了 Dog.prototype = Object.create(Animal.prototype)
var f = function(){};
f.prototype = Animal.pototype;
Dog.prototype = new f();
Dog.__proto__ = Animal;
//这里改变后会导致prototype中的constructor改变
Dog.prototype.constructor = Dog;


//现在就能访问到Animal中的species属性了
var dog = new Dog('lalala');
dog.species;//unknown
ログイン後にコピー

これらはプロトタイプを使用するいくつかの方法です。継承を実装するチェーン

ES6 クラス class

上記の知識を使って、ES6 クラスを見てみましょう。この構文シュガーを使用すると、extends、static などのキーワードが提供されます。 、そして超、より深く明確な理解が得られ、コンストラクターとinstanceofの使い方に慣れ、プロトタイプチェーンに基づく継承方法についての理解が深まり、この知識が明確になりました。

    babel によってコンパイルされた ES6 クラスのソース コードの分析では、Object.create と Object.setPrototypeOf の使用法についても学び、super、extends、static の実装をシミュレートする方法を検討しました。
  • 関連する推奨事項:
  • JavaScript オブジェクト指向 - プロトタイプ チェーンに基づく継承

JavaScript の継承とプロトタイプ チェーン

以上がJavaScriptのプロトタイプチェーンによる継承分析(コード添付)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

HTMLの表の境界線 HTMLの表の境界線 Sep 04, 2024 pm 04:49 PM

HTML の表の境界線に関するガイド。ここでは、HTML でのテーブルの境界線の例を示しながら、テーブル境界線を定義する複数の方法について説明します。

HTML のネストされたテーブル HTML のネストされたテーブル Sep 04, 2024 pm 04:49 PM

これは、HTML でのネストされたテーブルのガイドです。ここでは、テーブル内にテーブルを作成する方法をそれぞれの例とともに説明します。

HTML 左マージン HTML 左マージン Sep 04, 2024 pm 04:48 PM

HTML マージン左のガイド。ここでは、HTML margin-left の概要とその例、およびそのコード実装について説明します。

HTML テーブルのレイアウト HTML テーブルのレイアウト Sep 04, 2024 pm 04:54 PM

HTML テーブル レイアウトのガイド。ここでは、HTML テーブル レイアウトの値と例および出力について詳しく説明します。

HTML 内のテキストの移動 HTML 内のテキストの移動 Sep 04, 2024 pm 04:45 PM

HTML でのテキストの移動に関するガイド。ここでは、概要、マーキー タグが構文でどのように機能するか、および実装例について説明します。

HTML 順序付きリスト HTML 順序付きリスト Sep 04, 2024 pm 04:43 PM

HTML 順序付きリストのガイド。ここでは、HTML 順序付きリストと型の導入とその例についても説明します。

HTML の onclick ボタン HTML の onclick ボタン Sep 04, 2024 pm 04:49 PM

HTML オンクリック ボタンのガイド。ここでは、それらの紹介、動作、例、およびさまざまなイベントでの onclick イベントについてそれぞれ説明します。

HTML入力プレースホルダー HTML入力プレースホルダー Sep 04, 2024 pm 04:54 PM

HTML 入力プレースホルダーのガイド。ここでは、コードと出力とともに HTML 入力プレースホルダーの例について説明します。

See all articles