1

2つのコンストラクターと1つのメンバー関数が定義されているとします。

function A() {}
function B() {}
A.prototype.a = function(){}

そして、私はインスタンス化しましたB。変換を強制して変換するにはどうすればよいAですか?

o = new B();
//What should I put here?
o.a();

私はjsを初めて使用します。oそして、私は、上記がanであるAか、aであるかは、B単に。への参照によって制御されていると感じていprototypeます。したがって、型キャストは可能だと思います。

jsオブジェクトを理解するのに役立つ回答と説明を歓迎します。

4

1 に答える 1

3

一度作成されたオブジェクトのプロトタイプを変更(つまり、完全にスワップアウト)することはできません(ただし、JavaScriptの将来のバージョンでは可能になる可能性があります)。

ただし、JavaScriptのオブジェクトは非常に順応性があります。たとえば、これを行うことができます。

o.a = A.prototype.a;

...そして機能oがありaます。の列挙可能なすべてのプロパティ(プロトタイプからのものを含む)A.prototype提供したい場合:

var name;
for (name in A.prototype) {
    o[name] = A.prototype[name];
}

関数のprototypeプロパティは、関数の通常の退屈なプロパティに割り当てられた、完全に通常の退屈なオブジェクトです。newその関数(「コンストラクター関数」と呼ばれる)を使用してオブジェクトを作成するために使用する場合、関数のプロパティprototypeは、基礎となるプロトタイプとして新しく作成されたオブジェクトに割り当てられます(コードで[まだ]アクセスできる名前はありません)。 。

ES5(Chrome、Firefox、Opera、およびIE9で合理的にサポートされています。IE8以前ではサポートされていません)では、を使用してオブジェクトのプロトタイプを取得できますObject.getPrototypeOfまた、を使用してコンストラクター関数を実行せずに、プロトタイプを割り当てるオブジェクトを作成できますObject.create。ただし、作成されたオブジェクトのプロトタイプを変更することはできません。

一部のJavaScriptエンジン(Firefoxのエンジンなど)には、現在非標準の拡張機能__proto__があり、オブジェクトをプロパティとして扱うことで、オブジェクトのプロトタイプに直接アクセスして操作できます。例えば:

o.__proto__ = A.prototype;

...しかし、それは現在のところ標準ではありません。ただし、次の標準の一部になる可能性があります。今後のES6に関する情報に興味がある場合は、ドラフト仕様などをここで見つけることができます。

于 2012-12-02T09:18:39.253 に答える