ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript のプロトタイプとプロトタイプ チェーンを理解する

JavaScript のプロトタイプとプロトタイプ チェーンを理解する

PHPz
PHPzオリジナル
2016-05-16 15:48:091315ブラウズ

この記事では JavaScript のプロトタイプとプロトタイプチェーンを紹介します。必要な方は参考にしてください。

プロトタイプ

ご存知のとおり、JavaScript には従来のクラス継承モデルは含まれておらず、プロトタイプのプロトタイプ モデルが使用されます。コードの実装は大まかに次のとおりです。

function Student(name){
 this.name = name;
}
 
var Kimy = new Student("Kimy");
 
Student.prototype.say = function(){
 console.log(this.name + "say");
}

Kimy.say();
//Kimysay

Kimy 自体には Say メソッドがありません。自分のオブジェクトでメソッドが見つからない場合、プロトタイプに戻ってメソッドを見つけます。 Student.prototype オブジェクトで検索します。ここでは、コンストラクター Student

コンストラクター、__proto__ およびプロトタイプ チェーン

IE を除き、他のブラウザーは Object オブジェクトのインスタンス上にあります。 、非標準の __proto__ 属性 (前後 2 つのアンダースコア) がデプロイされ、オブジェクトのプロトタイプ オブジェクト、つまりコンストラクターのプロトタイプ属性を指します。

コードと画像の盗用

// 构造方法
function Foo(y) {
 this.y = y;
}
 
Foo.prototype.x = 10;
 
// 继承方法"calculate"
Foo.prototype.calculate = function (z) {
 return this.x + this.y + z;
};
 
// 使用foo模式创建 "b" and "c"
var b = new Foo(20);
var c = new Foo(30);
 
// 调用继承的方法
b.calculate(30); // 60
c.calculate(40); // 80
 
 
console.log(
 
 b.__proto__ === Foo.prototype, // true
 c.__proto__ === Foo.prototype, // true
 
 b.constructor === Foo, // true
 c.constructor === Foo, // true
 Foo.prototype.constructor === Foo // true
 
 b.calculate === b.__proto__.calculate, // true
 b.__proto__.calculate === Foo.prototype.calculate // true
 
);

各オブジェクトには __proto__ 属性が含まれており、 __proto__ はプロトタイプ属性を指していることがわかります。 Foo の b を構築するコンストラクター メソッドであり、Foo.prototype もオブジェクトであり、それを構築するコンストラクター メソッド Object を指す __proto__ プロトタイプもあります。 Object.prototype の __proto__ は null を指し、プロトタイプ チェーンを形成します。

ここでのコード部分も理解する必要があります:

Object instanceof Function
//true
Function instanceof Object
//true

new は何をするのか

ここにも小さな問題があります。 jsでは普通のことです。関数とコンストラクタの形式に大きな違いはないようです(最初の文字を大文字にする必要はありませんが、コンストラクタの最初の文字は通常大文字になります)。新しいキーワードは具体的に何をするのでしょうか?

例:

var Kimy = new Student();

new は次の 3 つのことを行います:

var Kimy = {}; 

Kimy.__proto__ = Student.prototype;

Student.call(Kimy);

1. 空のオブジェクトを定義します

2. そのプロトタイプ

3. 初期化オブジェクト

これにより、Kimy.__proto__ が Student.prototype (同じ参照) を指す理由が理解できます。new が重要な役割を果たしていることがわかります。

上記はこの記事の全内容です。その他の関連チュートリアルについては、JavaScript ビデオ チュートリアル をご覧ください。

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