【发布时间】:2014-05-04 04:41:30
【问题描述】:
背景
我正在尝试制作一个完全纯 JavaScript GUI 来创建用于学习目的的 HTML 内容。文件中唯一真正的 html 将是一个 <script></script> 元素。我想我快完成了。
我创建了一个自定义 HTML 元素构造函数,但是当我创建一个对象时,当我执行 alert(whatever); 时,显示的是 [object Object] 而不是 [object HTMLWhateverElement](参见下面的示例)。我认为这会阻止我将子元素附加到父元素时,它们都是由构造函数创建的。
主要问题
如果我可以让 HTML 实例附加到 HTML 标签和element 实例,那我会非常高兴。
构造函数
function element(tagName) {
var element = document.createElement(tagName);
this.setText = function(elementText) {
if(element.childNodes.length < 1) {
var text = document.createTextNode(elementText);
element.appendChild(text);
} else {
element.childNodes[0].nodeValue = elementText;
}
}
this.removeText = function() {
element.removeChild(element.childNodes[0]);
}
this.setAttribute = function(attribute,value) {
element.setAttribute(attribute,value);
}
this.removeAttribute = function(attribute) {
element.removeAttribute(attribute);
}
this.appendTo = function(parent) { // Works but not on element instances of the constructor
parent.appendChild(element);
}
this.details = function(){
alert(
"Type: " + element +
"\n\"typeof\": " + typeof(element) // Shouldn't need this right?
);
}
}
示例
ul = new element("ul");
ul.appendTo(body); // works fine if BODY is actually an HTML tag
alert(body); // gives me [object HTMLBodyElement] :)
alert(ul); // gives me [object Object] >(
li = new element("li"); // works :)
li.setText("list item text"); // works :)
li.appendTo(ul); // doesn't work >(
如果我能弄清楚如何将 JavaScript 创建的(子)elements 附加到其他 JavaScript 创建的(父)elements,我会很高兴的。我认为这与构造函数的实例化元素的返回值有关。
编辑
1) 可能的答案
@carter-sand 谢谢。
添加一个新的this.appendChild 方法有效,但重新发明了轮子
HTML 对象的内置 appendChild 方法。
2) 可能的答案
@s4mok 感谢您的提示。
将 var element 更改为 this.elem 有效,但会创建一个
时髦的界面:
li.appendTo(ul.elem);
对比
li.appendTo(ul);
我正在尝试模拟私人成员。
两个答案都有效,但都没有返回值 [object HTMLWhateverElement] 当我这样做时:
alert(li);
有没有办法获得上述所有好处?
【问题讨论】:
-
请注意,因为您在构造函数中添加了所有方法(当它们应该在其原型上时),所以对 element 的引用保存在闭包中。
-
@RobG,感谢您的反馈。是否可以在构造函数中向原型添加方法以模拟类声明?将 element 保持在闭包中是不是很糟糕?
-
向构造函数的原型添加方法是原型继承的工作原理。将 element 保留在闭包中是可以的(它有点模拟私有成员),但您可能希望将其设为公共成员以便于访问。
-
谢谢大家。您非常乐于助人,我从您的所有回复中学到了很多。对于其他读者,我选择了@Andrew Sellenrick 的答案,因为它完整而明确地回答了这个特定问题,但是如果您像我一样在 JavaScript 中的构造函数中苦苦挣扎,所有其他响应者也提供了非常有用的信息。
标签: javascript html object constructor return-type