21

我遇到了一个插件问题,该插件在 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 或更多跨浏览器兼容有什么好的解决方法?

提前致谢!

4

3 回答 3

37

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

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

这是规格:

15.2.3.5 Object.create(O[,属性])

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

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

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

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

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

返回对象。

这是轻量级实现:

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();
    };
}
于 2013-08-02T15:09:23.560 回答
20

有几个 shims 可以提供这个,包括这个

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

但是对于您引用的用例,可以使用伪垫片。

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

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();
    };
}
于 2013-08-02T15:09:15.440 回答
0

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

我尝试了垫片/假,但这对我不起作用。

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();
 };
}
于 2018-09-07T11:02:17.413 回答