ES5中的Object.defineProperty?

Dre*_*rew 8 javascript ecma262 prototypal-inheritance ecmascript-5

我正在看到有关"新"Object.create的帖子,它使枚举可配置.但是,它依赖于Object.defineProperty方法.我找不到这种方法的跨浏览器实现.

我们是不是在为旧的Object.create写作?我不能写出在IE6/7中无效的东西.

CMS*_*CMS 14

Object.createECMAScript 3环境中,您无法通过ECMAScript 5 方法模拟一些内容.

如您所见,properties参数将为您提供问题,因为在基于E3的实现中,无法更改属性属性.

Object.defineProperty如方法@Raynos提到的,适用于IE8,但部分地,它可用于在DOM元素.

此外存取器属性会给你的问题,他们可以模仿与广泛支持的非标准方法,如__defineGetter__/ __defineSetter__,但同样,你不能改变属性的属性.

除了属性描述符之外的另一个问题是,该Object.create方法可以接受null作为参数,以创建不从任何东西继承的对象.

这不能用Crockford的Object.create垫片模拟,因为当new运算符与具有prototype包含null-or或任何其他非对象值的属性的构造函数一起使用时,新创建的对象将Object.prototype默认继承.

在一些实现-V8,Spidermonkey,Rhino等......-他们有一个__proto__可设置的属性,可用于设置null[[Prototype]],但同样,这是非标准的,并且肯定它永远不会在IE上工作.

我建议,如果你想针对旧浏览器不使用这些功能,因为没有办法让它们在这些环境中正常工作.

如果你仍然想使用Object.create,而不使用属性参数,你可以,但我会建议你检测无法模拟的东西.

以下是Crockford 垫片更安全版本:Object.create

if (typeof Object.create != 'function') {
  (function () {
    var F = function () {};
    Object.create = function (o) {
      if (arguments.length > 1) { throw Error('Second argument not supported');}
      if (o === null) { throw Error('Cannot set a null [[Prototype]]');}
      if (typeof o != 'object') { throw TypeError('Argument must be an object');}
      F.prototype = o;
      return new F;
    };
  })();
}
Run Code Online (Sandbox Code Playgroud)

无论如何,请小心使用它.