問題タブ [prototypal-inheritance]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - オブジェクトをインスタンス化することは、JavaScriptで何らかの方法で継承するだけですか?
私は JavaScript の本を読んでいて、継承に関する章を読んでいて、オブジェクトのインスタンスを作成するたびに本当に継承が行われるのだろうかと疑問に思いました。特にそれらは似ているためです。
例: プロトタイプ連鎖 -someObject.prototype = new someOtherObject();
オブジェクトのインスタンス化var myArray = new Array()
似てますよね?
さらに、この本 (Web 開発者向けの JavaScript、作成者: Nicholas Zakas) には、インスタンスとコンストラクターのプロトタイプの間にリンクが存在すると述べられています (リンクは通常 として知られています__proto__
) 。
では、オブジェクトのインスタンス化は継承のようなものだと主張できますか?
javascript - Backbone.jsで、Modelスーパークラスのデフォルトをサブクラスのデフォルトとして機能させるにはどうすればよいですか?
いくつかのデフォルトを定義するクラスと、いくつかのデフォルトを定義するサブクラスがあります。しかし、サブクラスのインスタンスを作成すると、ローカルのデフォルトのみが表示され、そのデフォルトが親のデフォルトとマージされません。initialize
すべてのサブクラスの関数で、ローカルのデフォルトを親のデフォルトと明示的にマージせずにこれを行う簡単な方法はありますか?
これは以下を出力します:
私が欲しいものではありません:
javascript - モデル名を指定せずに、そのモデルのインスタンスから静的な Backbone.Model 関数を呼び出すにはどうすればよいですか?
Backbone.Model オブジェクトのインスタンスからアクセスしたい静的プロパティがあります。親コンストラクターをハードコーディングしてメソッドを呼び出すことができることはわかっていますが、これにより、多態的な静的関数を使用できなくなります。たとえば、他のコードを変更することなく、必要に応じてfoo
関数をオーバーライドできるようにしたいと考えています。ExtendedInventory
javascript - JavaScript で「クラス」(静的) メソッドまたはプロパティを使用するのはいつですか?
JavaScript では、なぜプロパティをコンストラクターに直接アタッチしたいのでしょうか?
__extend
次の行を含むCoffeeScript のヘルパー関数を見た後、この質問がありました。
プロパティ/メソッドをコンストラクターオブジェクトから直接サブクラス化されたオブジェクトにコピーします。しかし、なぜ誰かがそれをするのでしょうか?
ありがとう!
javascript - JavaScript でのプロトタイプ チェーンの作成 (ES-5)
次のように、プロトタイプ チェーンを使用してオブジェクトを作成する関数を作成しようとしています。
指定されたプロトタイプをラップして、独自のルックアップ チェーンをオーバーライドし (再利用できるように)、コピー/内部属性のラッピングを最小限に抑えたいと考えています。
オブジェクトのすべての属性アクセスをオーバーライドするために使用できる Javascript/ECMAScript 5 の機能はありますか? __getattribute__(self, attrname)
Pythonに似た何か?そうでない場合、どうすればいいですか?オブジェクトのプロパティを (を使用してObject.hasOwnProperty()
) 複製する必要がありますか?
javascript - JavaScript の典型的なオブジェクト指向
TL;DR:
プロトタイプの OO にファクトリ/コンストラクタが必要ですか? パラダイム スイッチを作成して、それらを完全にドロップできますか?
バックストーリー:
私は最近、JavaScript でプロトタイプの OO をいじっていましたが、JavaScript で行われた OO の 99% は、古典的な OO パターンをそれに強制していることに気付きました。
典型的な OO に対する私の見解は、それには 2 つのことが関係しているということです。メソッド (および静的データ) の静的プロトタイプとデータ バインディング。ファクトリやコンストラクタは必要ありません。
JavaScript では、これらは関数と を含むオブジェクト リテラルObject.create
です。
これは、すべてを静的な設計図/プロトタイプとしてモデル化し、できればドキュメント スタイルのデータベースに直接フックされるデータ バインディングの抽象化を行えることを意味します。つまり、オブジェクトはデータベースから取り出され、プロトタイプをデータで複製することによって作成されます。これは、コンストラクターロジック、ファクトリー、no がないことを意味しnew
ます。
サンプルコード:
疑似例は次のとおりです。
マイナーな説明:
ES5 は冗長であるため、特定のコードは冗長です。Entity
上記は設計図/プロトタイプです。データを持つ実際のオブジェクトは、 を使用して作成されObject.create(Entity, {...})
ます。
実際のデータ (この場合はコンポーネント) は、JSON ストアから直接読み込まれ、呼び出しに直接挿入されObject.create
ます。もちろん、コンポーネントの作成にも同様のパターンが適用され、合格したプロパティのみObject.hasOwnProperty
がデータベースに保存されます。
エンティティが初めて作成されるとき、それは空で作成されます{}
実際の質問:
今、私の実際の質問は
- JSプロトタイプOOのオープンソースの例?
- これは良い考えですか?
- 原型的な OOP の背後にあるアイデアや概念と一致していますか?
- コンストラクター/ファクトリー関数を使用しても、どこかでお尻を噛むことはありませんか? コンストラクタを使わなくても本当にうまくいくでしょうか。上記の方法論を使用して、それらを克服するために工場が必要な制限はありますか?
javascript - (オープン ソース) JavaScript プロトタイプ OO の例
バウンティ 編集:
純粋なプロトタイプ OO パラダイム (Self を考えてください)で記述されたコードを探しています。プロトタイプの OO と従来の OO の混合物ではありません。一般的な OO ラッパーは見たくありませんが、単にプロトタイプの OO 手法を使用し、プロトタイプの OO 手法のみを使用するだけです。
参照関連の質問:
上記の質問では、主に焦点を当てました
このようなプロトタイプの OO を記述できますか?
コンストラクターと初期化ロジックが必要ですか、代替手段は何ですか?
新しい質問:
基本的に、大規模なオープン ソース プロジェクトで javascript プロトタイプOO の良い例はありますか?
説明:
プロトタイプ OOの意味を明確にする必要があります。
- クラスはありません。オブジェクトしかありません。
- クラスの概念のエミュレーションはまったくありません。ここでも、新しいオブジェクトを作成するためのオブジェクトとオブジェクトのクローンしかありません。
プロトタイプ OO のさらなる説明:
JavaScript のプロトタイプの OO と従来の OO エミュレーションの違いは、非常にグレーな領域です。古典的なオブジェクト指向を避けることを重視しているわけではありません。私は、古典的な OO エミュレーションとプロトタイプ OO の (おそらくより最適な) 組み合わせを学ぶことなく、それ自体でアカデミックな方法でプロトタイプ OO を学びたいと考えています。
これが、私がクラスを「禁止」する理由です。これらの手法を純粋な方法で確認し、独自の OO ツール キットを拡張できるようにするためです。
例:
jQuery などの一般的な例は、2 番目の基準を満たしていません。オブジェクトは、1 つのjQuery
大きなクラス エミュレーションです。既存のオブジェクトを複製するのではなく、クラスから新しいオブジェクトを作成することに重点を置いています。
「純粋な」プロトタイプ OOの使用例を実際に知っていれば、お見せしたでしょう。JavaScript OO の 99% は、古典的なエミュレーションの影響を大きく受けていると思います。
ボーナスポイント
もしも
- 十分にコメント/文書化されています
- 単体テストあり
- github にあります。
また、単純な Hello World アプリケーションを超えるプロトタイプの OO コードの作成方法に関する記事/チュートリアルと例も受け付けます。
javascript - クロージャでプロトタイプパターンを使用する
私はJavascriptのプロトタイプとクロージャのパターンを少しいじっています。ご存知かもしれませんが、クロージャパターンを使用すると、オブジェクトのすべてのインスタンスに対して同じ関数が再定義されるため、パフォーマンスが低下します。ただし、クロージャパターンではプライベート変数が許可されるため、カプセル化が容易になります。
プロトタイプパターンの典型的な例を次に示します。
どうしてこんなことができないのかと思っていました。
これにより、foo()関数でプライベート変数が可能になり、foo()関数でプロトタイプを動的に設定することもできます。
jsperf.comのテストを行ったところ、実際にパフォーマンスに大きな違いが見られましたが、その理由はわかりません。
javascript - アレイにはデフォルトでプロトタイプがありませんか?
Array.prototype
メソッドで拡張して、任意の配列で呼び出すことができることを望んでいました。
しかし、アレイにはプロトタイプがないようです...?
ここで何かが足りませんか?
私の実際の問題は他の場所にあるようです。呼び出しは機能します[1, 2, 3].customMethod()
が、呼び出しsomeDomElement.childNodes.customMethod()
は失敗します。childNodes
実際の配列ではありませんか?