私はたまたまYou Do n't Know JS:this&Object Prototypesからプロトタイプを学んでいます。これは、下のデザインを理解し、非常に多くの誤解を明らかにするための素晴らしい本です(そのため、継承やなどの使用を避けようとしていinstanceof
ます)。
しかし、私は人々がここで尋ねたのと同じ質問があります。いくつかの答えは本当に役に立ち、啓発的です。私も私の理解を共有したいと思います。
プロトタイプとは何ですか?
JavaScriptのオブジェクトには、仕様でとして示されている内部プロパティがあり[[Prototype]]
、これは単に別のオブジェクトへの参照です。ほとんどすべてのオブジェクトには非null
、作成時にこのプロパティの値。
オブジェクトのプロトタイプを取得するにはどうすればよいですか?
__proto__
またはを介してObject.getPrototypeOf
var a = { name: "wendi" };
a.__proto__ === Object.prototype // true
Object.getPrototypeOf(a) === Object.prototype // true
function Foo() {};
var b = new Foo();
b.__proto__ === Foo.prototype
b.__proto__.__proto__ === Object.prototype
とはprototype
?
prototype
関数の特殊なプロパティとして自動的に作成されるオブジェクトであり、委任(継承)チェーン(別名プロトタイプチェーン)を確立するために使用されます。
私たちは関数を作成するとa
、prototype
自動的に特別なプロパティとして作成されたa
とように機能コードが保存されますconstructor
上prototype
。
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
このプロパティは、関数オブジェクトのプロパティ(メソッドを含む)を格納する場所と考えたいです。それが、JSのユーティリティ関数が、、のようArray.prototype.forEach()
に定義されている理由でもありますFunction.prototype.bind()
。Object.prototype.toString().
なぜ関数の特性を強調するのですか?
{}.prototype // undefined;
(function(){}).prototype // Object {constructor: function}
// The example above shows object does not have the prototype property.
// But we have Object.prototype, which implies an interesting fact that
typeof Object === "function"
var obj = new Object();
だから、Arary
、Function
、Object
すべての機能があります。これはJSに対する私の印象を新たにすることを認めるべきです。JSでは関数が一流の市民であることは知っていますが、関数に基づいて構築されているようです。
違いは何だ__proto__
とはprototype
?
__proto__
参照は、すべてのオブジェクトでその[[Prototype]]
プロパティを参照するように機能します。
prototype
関数の特別なプロパティとして自動的に作成されるオブジェクトです関数オブジェクトのプロパティ(メソッドを含む)を格納するために使用されるオブジェクトです。
これら2つを使用して、プロトタイプチェーンを精神的に計画することができます。この写真のように説明します:
function Foo() {}
var b = new Foo();
b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
__proto__
違いますconstructor.prototype
か?