ie8中不支持Object.create

时间:2013-08-02 15:06:46

标签: javascript jquery object internet-explorer-8

我遇到了一个插件的问题,该插件在jquery中使用object.create来创建日期下拉列表。我刚刚在IE 8中注意到它出现了错误:

SCRIPT438: Object doesn't support property or method 'create'

以下是代码:

var dropdateobj = Object.create(dropdatefuncs);
dropdateobj.create(options, this);
$.data(this, 'dropdate', dropdateobj);

IE8或更多跨浏览器兼容有什么好处?

提前致谢!

3 个答案:

答案 0 :(得分:37)

如果您需要Object.create,您很可能还需要依赖其他es5功能。因此,在大多数情况下,适当的解决方案是使用es5-shim

但是,如果Object.create是您唯一需要的东西,并且您只使用它来纯粹设置原型链,那么这里是一个不支持null作为第一个参数的轻量级多面填充不支持第二个properties参数。

这是规范:

  

15.2.3.5 Object.create(O [,Properties])

     

create函数使用指定的原型创建一个新对象。   调用create函数时,将执行以下步骤:

     

如果Type(O)不是Object或Null则抛出TypeError异常。

     

让obj成为创建新对象的结果,就像通过表达式一样   new Object()其中Object是标准的内置构造函数   那个名字

     

将obj的[[Prototype]]内部属性设置为O。

     

如果参数属性存在且未定义,请添加自己   obj的属性就好像通过调用标准内置函数一样   具有参数obj和Properties的Object.defineProperties。

     

返回obj。

这是轻量级实现:

if (!Object.create) {
    Object.create = function(o, properties) {
        if (typeof o !== 'object' && typeof o !== 'function') throw new TypeError('Object prototype may only be an Object: ' + o);
        else if (o === null) throw new Error("This browser's implementation of Object.create is a shim and doesn't support 'null' as the first argument.");

        if (typeof properties != 'undefined') throw new Error("This browser's implementation of Object.create is a shim and doesn't support a second argument.");

        function F() {}

        F.prototype = o;

        return new F();
    };
}

答案 1 :(得分:20)

有几个垫片提供此功能,包括this one

请注意,Object.create 无法完全填充,因为除了其他功能外,它还可以使用getter和setter创建不可枚举的属性或属性,这是您无法做到的在所有ES5之前的浏览器上。 (您可以使用专有语法在某些ES5之前的浏览器上进行getter和setter,但在IE8上我不相信。)它只能是伪填充的。

但是伪shim会对你引用的用例有用。

为了完整起见,这是一个可以填充的部件的简单版本:

if (!Object.create) {
    Object.create = function(proto, props) {
        if (typeof props !== "undefined") {
            throw "The multiple-argument version of Object.create is not provided by this browser and cannot be shimmed.";
        }
        function ctor() { }
        ctor.prototype = proto;
        return new ctor();
    };
}

答案 2 :(得分:0)

这将使Object.create()在IE 8中正常工作。

我尝试过填充(sham / sham),但这对我没有用。

if (typeof Object.create !== 'function') {
 Object.create = function(o, props) {
  function F() {}
  F.prototype = o;

  if (typeof(props) === "object") {
   for (prop in props) {
    if (props.hasOwnProperty((prop))) {
     F[prop] = props[prop];
    }
   }
  }
  return new F();
 };
}