問題タブ [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.
php - PHPでのプロトタイプの継承(JavaScriptなど)
JavaScriptで実装されているように、PHPである種のプロトタイプの継承を採用することは可能ですか?
この質問は、好奇心から頭に浮かびました。そのようなことを実行して、古典的な継承に反対しなければならないということではありません。探索するのに面白いエリアのように感じます。
PHPの古典的な継承モデルと、無名関数の組み合わせを使用したある種のプロトタイプの継承を組み合わせるためのビルド前の関数はありますか?
UserModelの単純なクラスがあるとしましょう
javascript - Javascript は、プロトタイプ チェーンの先頭を見つけます
関数を Object.prototype に設定し、オブジェクト Foo から関数を呼び出そうとした場合、関数が最初に呼び出したオブジェクトを知る方法はありますか?
ありがとう!
javascript - Javascript オブジェクトのプロトタイプ チェーンを表示するにはどうすればよいですか?
次のコードがあるとします。
のプロトタイプチェーンa
に追加された滞在ができます。b
偉大な。また、次のすべてが当てはまります。
b1
私の質問は、前もっての起源がわからない場合はどうなるかということです。プロトタイプチェーンのメンバーをどのように発見できますか? [b, a, Object]
理想的には、またはのような配列が必要["b", "a", "Object"]
です。
これは可能ですか?SOのどこかでこれを見つける方法を説明した答えを見たことがあると思いますが、私の人生では二度と見つけることができません。
javascript - コンストラクター関数内からプロトタイプにメソッドをアタッチする
これは、JavaScriptの決定的なガイドから直接、JavaScriptで「クラス」またはコンストラクター関数を記述する教科書の標準的な方法です。
ここでぶら下がっているプロトタイプの操作は好きではないのでarea
、コンストラクター内の関数定義をカプセル化する方法を考えようとしていました。私はこれを思いついたが、これはうまくいくとは思っていなかった。
this
関数内の参照は関数自体area
を指している必要があるため、これが機能するとは思っていませんでした。そのため、にアクセスしたり、からアクセスしたりすることはできません。しかし、私はそうすることがわかりました!area
width
height
this
さらにいくつかのテストにより、関数this
内の参照がarea
実際にはエリア関数自体ではなく、構築中のオブジェクトへの参照であることが確認されました。
アラートがポップアップし、this
まさに建設中のオブジェクトであることがわかります。では、ここで何が起こっているのでしょうか。なぜ私はそれが期待されないthis
のですか?this
javascript - 「this =」を使用するJavascript関数は、「割り当ての左辺が無効です」を返します
別のオブジェクトのコンストラクターの「this」割り当てを使用する JavaScript オブジェクトを取得しようとしているだけでなく、そのすべてのオブジェクトのプロトタイプ関数を想定しています。これが私が達成しようとしているものの例です:
ObjY が ObjX の「this」への割り当てを包含し (つまりthis.$* = *
、ObjY のコンストラクターですべての割り当てを繰り返す必要がない)、ObjY が ObjX.prototype を想定する方法について、ご意見をお聞かせください。
私の最初の考えは、次のことを試すことです。
理想的には、プロトタイプの方法でこれを行う方法を学びたいと思います (つまり、Base2のような「古典的な」OOP 代替を使用する必要はありません)。
ObjY が匿名 (例: factory['ObjX'] = function(a,b,c) { this = ObjX(a,b*12); ... }
) であることは注目に値するかもしれません。
ありがとうございました。
javascript - プロトタイプを使用したJavascript関数継承
Douglas CrockfordのJavaScript:The Good Partsで、彼は関数型継承を使用することを推奨しています。次に例を示します。
mammal
私がこれに関して抱えている主な問題は、またはJavaScriptインタープリターを作成するたびに、そのcat
中のすべての関数を再コンパイルする必要があるということです。つまり、インスタンス間でコードを共有することはできません。
私の質問は、このコードをより効率的にするにはどうすればよいですか?たとえばcat
、何千ものオブジェクトを作成している場合、オブジェクトを利用するためにこのパターンを変更する最良の方法は何prototype
ですか?
javascript - 'new'を使用して関数を呼び出すことは、それがない場合よりも安価ですか?
プロトタイプ構造のこの非常によく知られているモデルを考えると:
'new'キーワードなしnew Rectangle(2,3)
で呼び出すよりも、呼び出しが一貫して10倍高速である理由を誰かが説明できますか?Rectangle(2,3)
newはプロトタイプを関与させることで関数の実行をより複雑にするので、遅くなると思いました。
例:
歩留まり(Chrome):
javascript - Crockfordのオブジェクト作成テクニックで何が起こっているのですか?
コードは3行しかありませんが、これを完全に把握するのに問題があります。
(プロトタイプの継承から)
Object.create()
と呼ばれる空の関数を作成することから始めますF
。関数は一種のオブジェクトだと思います。このF
オブジェクトはどこに保存されていますか?世界的に私は推測します。次に、
oldObject
として渡されたo
、が関数のプロトタイプになりますF
。関数(つまり、オブジェクト)は、名前解決がそれを経由するという意味で、F
私たちから「継承」するようになりました。oldObject
良いですが、オブジェクトのデフォルトのプロトタイプが何であるか知りたいのですが、Object?それは関数オブジェクトにも当てはまりますか?最後に、
F
がインスタンス化されて返され、私たちのになりますnewObject
。ここでのnew
操作は厳密に必要ですか?必要なものをまだ提供していませんF
か、または関数オブジェクトと非関数オブジェクトの間に重大な違いがありますか?明らかに、この手法を使用してコンストラクター関数を作成することはできません。
次回Object.create()
はどうなりますか?グローバル関数はF
上書きされますか?以前に構成されたオブジェクトが変更されるため、再利用されないことは確かです。また、複数のスレッドが呼び出された場合はどうなりますか?Object.create()
競合状態を防ぐための同期はありますF
か?
c# - C# 4.0 の ExpandoObject はプロトタイプベースの継承をサポートしていますか?
C# 4.0 のExpandoObjectはプロトタイプベースの継承をサポートしていますか? そうでない場合は、なぜですか (それは設計によるものですか?)、また、これをどのように実装できますか? はいの場合、それはどのように機能し、Javascript での機能と比較してどのような違いがありますか?
python - プロトタイプの実装またはクラス オブジェクトのインスタンス化
updated 2010-06-15T09:45:00Z
:
- 「インスタンスとしてのクラス」アプローチの例と、「クラスとしてのインスタンス」アプローチの説明を追加しました。Alex Martelliの回答を組み込み、参照しました。
Python でプロトタイプの継承を実装する方法を考えています。この問題には、インスタンスとしてのクラスとクラスとしてのインスタンスという 2 つの異なるアプローチがあるようです。
2 番目の方法は、さまざまなタイプの既存のオブジェクトに適用できるという点で、より柔軟に見えますが、最初の方法は、典型的なユース ケースにより便利である可能性があります。
インスタンスとしてのクラス
ここでの考え方は、メタクラスを使用してインスタンス化を実際にオブジェクトではなくクラスにすることです。このアプローチは次のようになります。
このアプローチで複雑なことを実際にテストしたことはないので、制限があるかもしれません。
クラスとしてのインスタンス
このアプローチでは、type
コンストラクターを使用してオブジェクトからクラスを作成するという考え方です。これはAlex Martelli の answerに例示されていますが、このアプローチで彼が使用する例では、子孫がプロトタイプへの後の変更を継承できるようにするのではなく、コピー プロトタイプを実装しています。
私のアプローチは、次のようなことをすることでした:
これは、一種の javascript-y の方法で機能します。特定のオブジェクトへの変更は、その子孫には影響しませんが、親オブジェクト__class__
( javascript などprototype
) の変更には影響しません。これは、type
コンストラクターがある種の mro-ish スキームで参照するのではなく、コピーするためだと思います。 obj.__dict__
オブジェクトが親オブジェクトへの更新を継承する、真のプロトタイプ継承を可能にする改良版の実装を試みました。アイデアは、プロトタイプ オブジェクトの__dict__
プロパティを、新しく作成されたクラス (子孫オブジェクトのクラスになるクラス) の同じプロパティに割り当てることでした。
ただし、これはうまくいきませんでし__dict__
たtype
。この制限は、 から派生したクラスにも適用されますtype
。イテラブルやシーケンスなどで行われるように、「型プロトコルを実装する」オブジェクトを作成することでこの問題を回避できるかどうか、まだ興味がありますが、実際には から継承しませんtype
。これにより、アレックスが回答の最初の部分で言及した委任アプローチに固有の問題など、他の問題が発生する可能性があります。
委任
__getattr__
アレックスは、オブジェクトの状態が魔法のメソッドを介して子孫オブジェクトに伝播される、委任の 3 番目のアプローチも提案しています。繰り返しますが、例については Alex の回答と、このアプローチの制限の詳細を参照してください。
これらのアプローチの実用性に関するさらなる洞察と、代替提案がここに求められます。