0

私は自分のウィジェットを作成していました:

Button = function(){};
Button.prototype = document.createElement('INPUT');

btn = new Button();
btn.type = 'BUTTON';
btn.value = 'test';
btn.onclick = function(){alert('TEST!')}
document.body.appendChild(btn);

新しいタブを開いて Firefox のコンソールにコピー アンド ペーストするだけで、これは問題なく実行されます。しかし、それらを js ファイル (でラップ$(document).ready) に入れて HTML にリンクし、ブラウザで HTML を開くと、失敗しました。

btn.onclick行で、それは私に言います:

uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object"  nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)"  location: "JS frame :: main.js :: <TOP_LEVEL> :: line 12"  data: no]

私はプロトタイプを継承したのでエラーを理解していますが、私new-edは要素を(直接操作していません)、コンソールで正常に動作します。誰でも問題を指摘できますか?

4

2 に答える 2

2

Firefox の開発者コンソールで作業しているかどうかに関係なく (btn.type = ...オンラインで)、エラーが発生します。

一般に、ホスト オブジェクトがプロトタイプとして正しく機能することは保証されていません。仕様の§8.6.2から:

すべてのオブジェクトには、 と呼ばれる内部プロパティがあります[[Prototype]]。このプロパティの値はnullまたは オブジェクトであり、継承の実装に使用されます。ネイティブ オブジェクトがホスト オブジェクトを持つことができるかどうかは[[Prototype]]、実装に依存します。

(私の強調)

どうやらこの場合、実装 (Firefox の SpiderMonkey) はそれを好まないようです。

ホスト オブジェクトをプロトタイプとして使用しようとする代わりに、最善の策はおそらく Paul が回答で提案したことを実行することです。(コンストラクター関数が別のオブジェクトを返す場合、によって作成された新しいオブジェクトは破棄されるため、コンストラクターは の有無にButtonかかわらず機能します。)newnew

于 2012-12-22T18:43:18.107 に答える