:
関連し
new something2() instanceof something2 === false
、あなたはprototypeプロパティ
Something.prototype.method = function() { };
something2.prototype.method = function() { };
を使用するためにあなたの例を拡張する場合は、プロトタイプが後者の場合には継承されていないことがわかります:
typeof (new Something()).method === "function"
type (new something2()).method === "undefined"
リア私は、あなたがまったく異なる基礎をなす機械に触れているという答えです。new
を呼び出すと[[Construct]]メカニズムが呼び出されます。このメカニズムでは、コンストラクタの.prototype
プロパティに従って[[Prototype]]プロパティを設定します。
しかし、[[Construct]]アルゴリズムのステップ8-10では、新しい空のオブジェクトを設定してから、[[Prototype]]を付けた後、[[Call] ]を実際のコンストラクタに渡します。この新しい空白+プロトタイプオブジェクトはthis
です。そして、ステップ9で、そのコンストラクタが何かを返すことが判明した場合、それはそのプロトタイプバインドされたものをスローして、そのまま渡します。this
注:いくつかのメタの質問に答えるために
Object.getPrototypeOf(new Something()) === Something.prototype // steps 5 & 6
Object.getPrototypeOf(new something2()) === Object.prototype // default
:あなたはObject.getPrototypeOf
と、オブジェクトの[[プロトタイプ]]を(コンストラクタの.prototype
は異なる)にアクセスすることができます
- いいえ、
something2
はファクトリ関数であり、コンストラクタではないため、大文字ではありません。何かが大文字にされていると、コンストラクタセマンティクスを持つことが期待されます。 new A() instanceof A
。
- グローバル名前空間が壊れる危険性がある場合は、ファイルの先頭に
"use strict";
と入力してstrict modeを使用してください。厳密モードの多くの素敵なクリーンアップの1つは、this
がデフォルトでundefined
であり、グローバルオブジェクトではないということです。 new
を含まないコンストラクタを呼び出すと、コンストラクタがプロパティをundefined
にアタッチしようとするとエラーが発生します。
- ファクトリ関数(「クロージャパターン」とも呼ばれます)は、(a)継承を使用しない限り、一般的にコンストラクタとクラスの代用として適しています。 (b)そのオブジェクトのインスタンスをあまりにも多く構築していない。後者の理由は、クロージャーパターンでは、すべてのメソッドの新しいインスタンスを新しく作成されたすべてのオブジェクトにアタッチするためです。これはメモリ使用にはあまり役に立ちません。クロージャパターンの最大の利益(IMO)は、"private" variables(これはgood thingであり、他に誰かにあなたに伝えさせないでください:P)を使う能力です。 (新しい
keyword
とIE)コンストラクタとしての機能を呼び出す
に相当し、新しいオブジェクト
氏の少し警戒して作成し、そこから空白の範囲を、作成しているため、新しいsomething2は、非効率的ですクロフォード。彼には良いことがたくさんありますが、意見には意見があります。 – staticsan