我们在工作中使用了一个自定义 JavaScript 库,我们这样做:
DOM.__proto__ = Library.prototype;
快速传输内部函数/属性 DOM 对象,以便可以像 jQuery 那样使用它。
对于一个新项目,我们需要为 Internet Explorer 实现它,但不幸__proto__
的是 IE 不支持。
对此有什么想法和解决方法吗?要求只有 IE10(但 IE9 也不错)。
我们在工作中使用了一个自定义 JavaScript 库,我们这样做:
DOM.__proto__ = Library.prototype;
快速传输内部函数/属性 DOM 对象,以便可以像 jQuery 那样使用它。
对于一个新项目,我们需要为 Internet Explorer 实现它,但不幸__proto__
的是 IE 不支持。
对此有什么想法和解决方法吗?要求只有 IE10(但 IE9 也不错)。
与其__proto__
在创建DOM
对象后分配给,不如使用Object.create
(MSDN,自 IE9 起支持)创建具有正确原型的对象,然后为其分配属性。
var DOM = {}; DOM.__proto__ = Library.prototype;
var DOM = Object.create(Library.prototype);
如果您想修改现有(甚至可能是外来)对象的原型,请避免使用它。无论如何,这是一个不好的做法。
您可以使用 API 包装它,而不是直接扩展 DOM 元素;
// Wrapping Constructor
function Library(element) {
this.element = element;
}
// Whatever it is your library does
Library.prototype = {
// some example method
html: function(markup) {
// refer to "this.element" instead of "this"
this.element.innerHTML = markup;
}
};
// example
var wrappedElement = new Library(document.getElementById('unique'));
// refer to the API rather than the Element directly
wrappedElement.html('<span>Hello World</span>');
您还可以通过使用这种技术安全地继承 Array 来进一步扩展 Library 。
希望这会有所帮助,谢谢。
如何扩展它:
$.extend(Element.constructor.prototype, Library.prototype);
编辑:由于公众的强烈抗议,我会注意到这extend
是 2014 年 JS 编程背景下的一个非常熟悉的概念。你可以在网上找到很多关于它是什么以及它是如何工作的例子,而且非常好您在项目中已经使用的至少一个库可能会实现它(jQuery、Lo-Dash/Underscore、AngularJS、Ember.js...)