__proto__适用于Internet Explorer IE 10的解决方法

时间:2012-11-27 15:35:43

标签: javascript html5 prototype prototypal-inheritance

我们在工作时使用自定义JavaScript库:

DOM.__proto__ = Library.prototype;

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

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

为此填料的任何想法,解决方法?该要求仅限IE10(但IE9也不错)。

3 个答案:

答案 0 :(得分:2)

在创建__proto__对象后,不要分配给DOM,而是使用{IE}支持的Object.createMSDN创建对象使用正确的原型,然后为其分配属性。

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

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

答案 1 :(得分:1)

您可以使用API​​包装DOM元素,而不是直接扩展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>');

您还可以通过safely subclassing Array with this technique更多地扩展库。

希望这有帮助,谢谢。

答案 2 :(得分:0)

如何扩展它:

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

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