2

在 jQuery 中,您可以调用这样的函数,例如:

$("id").someFunction();

现在在查看 jQuery 的代码库之后,看起来使用创建的对象$修改了它的原型以返回通过添加的函数.fn,在我的应用程序中,我只想要相同的语法而不需要 jQuery。

这种行为的另一个例子是Javascript的一些内置方法,.replace例如.toLowerCase:听到)。.split.toString

我如何能够向分配的每个“字符串”或“对象”的原型添加一个函数。我这样做的原因是我试图创建一个附加事件的跨浏览器实现,而不必一直执行 if 语句。

因此,不需要去: if ( el.addEventListener) 或 if ( el.attachEvent) 我希望能够去el.bindEvent哪个幕后将是幕后的原型方法,它将执行所有检查事件绑定等。

在分配原型方法和诸如此类的东西方面,我的高级 JS 知识并不是那么好,因此感谢您在理解和纠正我所说的任何内容方面的帮助。

4

2 回答 2

4

扩展 DOM 元素的原型比扩展内置对象更糟糕†</sup>。请查看文章“扩展 DOM 有什么问题”

jQuery 提供的是一个简单的 DOM API包装器,这没问题。扩展 DOM 的问题在于

  • 它们是宿主对象,其行为可能与 ECMAScript 规范中定义的对象不同,并且
  • 较旧的 IE 版本甚至不公开 DOM 节点的原型。

我这样做的原因是我试图创建一个附加事件的跨浏览器实现,而不必一直执行 if 语句。

仅凭这一点就没有理由扩展 DOM。您可以定义自己的函数来绑定事件处理程序,您甚至必须在页面加载时测试addEventListener是否attachEvent仅存在一次。这样的函数可能如下所示:

var bindEvent = (function() {
    if (document.addEventListener) {
        return function(element, event, handler) {
            element.addEventListener(event, handler, false);
        };
    }
    else {
        return function(element, event, handler) {
            element.attachEvent("on" + event, function() {
                handler.call(element, window.event);
            }
        };
    }
}());

您可以在这样的函数中进行大量规范化。例如,当使用attachEvent,this通常不引用处理程序绑定到的元素(它引用window),这与 with 不同addEventListener。此外,您可能知道,事件对象不会作为参数传递给 IE 中的处理程序。这两个问题都通过这条线解决了:

handler.call(element, window.event);

(缺点是你不能简单地移除处理程序,因为你没有handler直接绑定,但这些问题也可以解决)。

您可以在 quirksmode.org 上的优秀文章中找到有关这些浏览器差异的更多信息和更多信息。


†:由于浏览器提供Object.defineProperty了将属性标记为不可枚举的可能性,因此扩展内置对象不再那么糟糕了,但如果库开始使用它,名称冲突、方法覆盖和不兼容的可能性就会更高。
对于您自己的代码,应该没问题。DOM 对象仍然应该是一个禁忌。

于 2013-02-26T02:00:29.423 回答
0

If I understood correctly, you want to know how to add methods to the built in javascript objects, so:

myObject.prototype.myMethod = function() {
  // whatever
}

so, by example:

String.prototype.splice = function() {
// splice function for every string
}
于 2013-02-25T22:57:35.873 回答