1

JavaScript コードを考えると:

function Parent() { ... }
function Child() { ... }

Child.prototype = new Parent();

// toString implementation on the parent object
Parent.prototype.toString = function() {
  return this.constructor.name;
}

// And the code:
alert(new Child());

...必要な結果が「子」文字列を取得することである場合、「親」を出力します(親実装のconstructor.name内部は子コンストラクター名を返す必要があります)。toString

これは JavaScript で可能ですか?

4

1 に答える 1

0

コード結果に表示される不整合は、2つの理由によって引き起こされます。まず、子プロトタイプオブジェクトをチェックすると、Object.getPrototypeOf(Child)が得られるため、プロトタイプオブジェクトの割り当てを修正するには、プロトタイプチェーンの問題の.secondの代わりにfunction Empty(){}使用する必要があります。新しい割り当て後の結果が表示された場合は、次のようになります(親プロトタイプtoString()メソッドを定義していない場合。定義している場合は、Parent(子プロトタイプ)プロトタイプtoString()メソッドを返します)。これは、子を意味します。プロトタイプ属性にオブジェクトがあります。次に、3つの選択肢があります。Child.__proto__ = new Parent()Child.prototype = new Parent();Object.getPrototypeOf(Child)[object Object]

1. toString()メソッドを子オブジェクト自体に割り当てます。

Child.toString = function(){ return this.name }

この場合、プロトタイプの割り当て後にコンストラクターがParentthis.constructor.nameに変更されたため、使用しないでください。

2.子prototype(Parent)toString()メソッドを定義します。

Child.__proto__.toString = function(){ return this.name }

3.子prototype->prototype(Object)toString()メソッドを定義します:(オーバーライド

Parent.prototype.toString = function(){ return this.name }

いくつかの観察:

1.最初に割り当てに使用した理由__proto__は、オブジェクトのコンストラクター関数の元のプロトタイププロパティにアクセスして変更したかったためです。

2.これらのメソッドはChildから呼び出されるため、使用return this.nameしました。そのため、ChildObjectを参照します。

3.オプション2オプション3で使用__proto__した理由は、Objectコンストラクターが変更された場合と、Objectコンストラクターが変更されていない場合に使用するためです。prototype__proto__prototype

4.メソッドをテストするには、代わりにtoString()使用する必要があります。alert(Child)alert(new Child())

これは、プロトタイプについて多くのことを助ける記事です:

http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/

この回答のすべての側面は、ChromeJSコンソールでテストされています。

于 2013-01-06T21:03:11.793 に答える