3

DOM Element オブジェクトから継承しようとしていますが、オブジェクトを作成するとすべてのコードが正常に実行されますが、appendChild() メソッドを呼び出そうとすると、次のようなエラーが表示されます。

MyObject doesn't have an appendChild method

これが私のコードです:

var content=document.createTextNode("This was dynamically created");
function MyObject(tagName){
    Element.constructor.call(this,tagName);
    this.prototype=Element.prototype;
    this.prototype=Object.defineProperties(this.prototype,{
       newMethod:function(){
       //dosomething

       }
    });
}
var newObj=new MyObject("div");
newObj.appendChild(content);
4

2 に答える 2

5

あなたはそれを間違ってやっていますが(後で詳しく説明します)、最終的にDOM要素自体ではなくDOM要素から継承するオブジェクトを渡そうとしています。これは許可されていません。

動作するはずですが、DOM 要素と DOM メソッドはホスト オブジェクトです。それらは、ネイティブ オブジェクトに期待されるのとまったく同じルールに従って動作するわけではありません。この.appendChild()メソッドは Element だけを必要とします。だから、あなたがやろうとしていることがうまくいきません。


継承へのアプローチに関しては、完全に間違っています。.prototype作成される新しいオブジェクトのプロパティは変更しません。.prototypeコンストラクター関数の を変更します。これが一度行われると、コンストラクターから作成されたすべての新しいオブジェクトは、そのコンストラクターの.prototypeプロパティに割り当てられたオブジェクトから継承されます。

あなたが持っている方法では継承がないため、.appendChild()メソッドはありません。以下のコードはそれを修正しますが、上記の理由によりまだ機能しません。

function MyObject(tagName){
    Element.call(this, tagName);
}

MyObject.prototype=Object.create(Element.prototype);

Object.defineProperties(MyObject.prototype,{
   newMethod: {
       value:function(){
           //dosomething
       }
   }
});

プロパティ記述子の構文も間違っていたので、修正しました。

于 2013-04-18T05:49:50.617 に答える
-1

これは、Element のコンストラクター関数を呼び出しても、DOM Element オブジェクトのインスタンスが作成されず、DOM Element オブジェクトのコンストラクター関数によって設定される属性を設定しようとするためです。たとえば、

function MyObject(tagName){
Element.constructor.call(this, tagName);
}
var newObj=new MyObject("div");

tagNameDOM Element オブジェクトのインスタンスを作成するときに使用できるような属性を作成せず、

alert("Tag Name is set to "+newObj.tagName);

表示されます

Tag Name is set to undefined

コンストラクタ関数がそれを設定しようとしたが、属性がなかったのでできませんでしたが、あなたtagNameに置き換えるElement.constructor.call(this, tagName);document.createElement(tagName)結果が得られます

Tag Name is set to DIV
于 2013-04-18T08:02:48.743 に答える