javascript - DOM 元素原型(prototype)

标签 javascript html dom

我正在创建自己的小部件:

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]

我有点理解这个错误,因为我继承了原型(prototype),但是我new了元素(不直接作用于它),并且它在控制台中运行正常。谁能指出问题所在吗?

最佳答案

你不能像这样创建 DOM 节点(而且你也没有正确地进行原型(prototype)设计,你需要使用 HTMLInputElement.prototype 但那是另一回事),而是这样做

Button = function(){
    var btn = document.createElement('INPUT');
    btn.type = 'BUTTON';
    return btn;
};

您仍然可以执行new Button,只不过这次它将按预期工作。

<小时/>

编辑:如果您想使用 Button.prototype 定义属性和方法,您可以将它们复制到构造函数中的 btn (这将是 ByVal 不是ByRef)

for (i in Button.prototype) { // make sure to var i
    btn[i] = Button.prototype[i];
}

尝试使用如下所示的原型(prototype),但请注意,对 Button.prototype 的更改不会反射(reflect)在已创建的 btn 中。

Button.prototype = {test: function () {console.log('invoked');}}

关于javascript - DOM 元素原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14005458/

相关文章:

php - php文件中页面顶部是什么意思

javascript - DOM 节点的警告 : ReactDOMComponent: Do not access . Prop

javascript - 创建图像对象数组

javascript - "TypeError: d is undefined"在带有鼠标悬停事件的条形图上转换时

javascript - IE : Removing readonly doesn't work until clicked

javascript - 如何使用 JavaScript 访问 HTML 链接内容

javascript - 重点播放视频

javascript - 从不同的页面访问打开的窗口

Javascript Array.filter() 和 Array.some()

javascript - Node.js 客户端无法看到来自 Express 服务器的数据