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()方法需要一个元素,而不是别的。所以你试图做的事情是行不通的。


关于您的继承方法,这是完全不正确的。您不会修改.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");

不会创建tagName类似于我们创建 DOM 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 回答