ホームページ  >  記事  >  ウェブフロントエンド  >  プロトタイプと __proto__ の違いの詳細な紹介

プロトタイプと __proto__ の違いの詳細な紹介

高洛峰
高洛峰オリジナル
2017-01-10 11:11:331306ブラウズ

prototype与__proto__区别

各コンストラクターは、プロトタイプベースの継承と共有プロパティを実装するために使用される「prototype」という名前のプロパティを持つ関数です。コンストラクターによって作成されたすべてのオブジェクトには、コンストラクターの「プロトタイプ」プロパティの値への暗黙的な参照 (オブジェクトのプロトタイプと呼ばれる) があります。 
コンストラクターがオブジェクトを作成すると、そのオブジェクトはプロパティ参照を解決するために、コンストラクターのプロトタイプ プロパティを暗黙的に参照します。コンストラクターのプロトタイプ プロパティは、プログラム式 constructionor.prototype によって参照でき、オブジェクトのプロトタイプに追加されたプロパティは、継承を通じて、プロトタイプを共有するすべてのオブジェクトによって共有されます。あるいは、Object.create 組み込み関数を使用して、明示的に指定されたプロトタイプを使用して新しいオブジェクトを作成することもできます。 –ECMAScript® 2015 言語仕様

__proto__ は每个对オブジェクト都有的一属性,而してプロトタイプは関数数才会有的プロパティ!!! 

__proto__ の代わりに Object.getPrototypeOf() を使用します!!!

一、プロトタイプ

几乎すべての関数 (除了一部内建関数) がすべてプロトタイプ (原型) のプロパティです。このプロパティは 1 つの指针です。プロトタイプは、構造関数によって作成されたそのオブジェクト インスタンスのプロトタイプ オブジェクトです。hasOwnProperty() は、指定されたプロパティが独自のものであるかどうかを判断します。

例: 独自プロパティ & 原型プロパティ

var obj = {a: 1};
obj.hasOwnProperty("a"); // true
obj.hasOwnProperty("toString"); // false
"a" in obj; // true
"toString" in obj; // true

例: 鉴别原型プロパティ

function hasPrototypeProperty(obj, name){
  return name in obj && !obj.hasOwnProperty(name);
}

二、__proto__

オブジェクトはプロパティ __proto__ を持ち、これは、オブジェクトの構造関数のテンプレートを構築するための、オブジェクトの構造関数のテンプレートを指示する、オブジェクト型のプロテイン、つまり構造関数のプロテインで定義されたプロパティと方法を保証します。

function Foo(){}
var Boo = {name: "Boo"};
Foo.prototype = Boo;
var f = new Foo();
 
console.log(f.__proto__ === Foo.prototype); // true
console.log(f.__proto__ === Boo);  // true
Object.getPrototypeOf(f) === f.__proto__;  // true

三、Object.getPrototypeOf()

の 1 つのオブジェクト サンプルは、内部プロパティ [[Prototype]] を介してその原型オブジェクトを追跡します。 原型オブジェクトを使用すると、すべてのオブジェクト サンプルに含まれるプロパティとメソッドを共有できるようになります。オブジェクトの Object.getPrototypeOf() メソッドを使用して [[Prototype]] プロパティの値を取得することも、isPrototypeOf() メソッドを使用して特定のオブジェクトが別のオブジェクトの原型オブジェクトであるかどうかを検査することもできます。都は、__proto__ という名前のプロパティをサポートしており、このプロパティは [[Prototype]] プロパティを直接書き込むことができます。この存在と正確な動作は、Web ブラウザーとの互換性を確保するためのレガシー機能として ECMAScript 6 仕様でのみ標準化されています。サポートを向上させるために、代わりに Object.getPrototypeOf() のみを使用することをお勧めします。 –MDN

感谢阅读、希望能帮助大家,谢谢大家对本站的支持!

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