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

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元素(不直接作用于它),它在控制台中可以正常运行。谁能指出这个问题?

最佳答案

您不能像这样创建DOM节点(而且无论如何您都无法正确进行原型设计,您需要使用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];
}


尝试使用以下原型,但请注意,对Button.prototype的更改不会反映在已经创建的btn中。

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

10-05 20:55
查看更多