5

我们在工作中使用了一个自定义 JavaScript 库,我们这样做:

DOM.__proto__ = Library.prototype;

快速传输内部函数/属性 DOM 对象,以便可以像 jQuery 那样使用它。

对于一个新项目,我们需要为 Internet Explorer 实现它,但不幸__proto__的是 IE 不支持。

对此有什么想法和解决方法吗?要求只有 IE10(但 IE9 也不错)。

4

3 回答 3

2

与其__proto__在创建DOM对象后分配给,不如使用Object.createMSDN,自 IE9 起支持)创建具有正确原型的对象,然后为其分配属性。

var DOM = {};
DOM.__proto__ = Library.prototype;
var DOM = Object.create(Library.prototype);

如果您想修改现有(甚至可能是外来)对象的原型,请避免使用它。无论如何,这是一个不好的做法。

于 2014-09-21T14:32:38.723 回答
1

您可以使用 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 。

希望这会有所帮助,谢谢。

于 2013-02-11T20:35:42.453 回答
0

如何扩展它:

$.extend(Element.constructor.prototype, Library.prototype);

编辑:由于公众的强烈抗议,我会注意到这extend是 2014 年 JS 编程背景下的一个非常熟悉的概念。你可以在网上找到很多关于它是什么以及它是如何工作的例子,而且非常好您在项目中已经使用的至少一个库可能会实现它(jQuery、Lo-Dash/Underscore、AngularJS、Ember.js...)

于 2014-09-21T14:18:48.150 回答