有几件事是您无法从 ECMAScript 5 中模拟的Object.create
ECMAScript 3 环境上的方法。
正如您所看到的,属性参数会给您带来问题,因为在基于 E3 的实现中存在no way更改属性属性。
The Object.defineProperty
方法如@Raynos提到过,可以在 IE8 上运行,但是部分地,可以使用only在 DOM 元素中。
Also 访问器属性会给你带来问题,它们可能是mimicked具有广泛支持的非标准方法,例如__defineGetter__ https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineGetter/__defineSetter__ https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineSetter,但是你再说一次无法更改属性属性.
除了属性描述符之外的另一个问题是Object.create
方法可以接受null
作为参数,创建一个不继承任何内容的对象。
这不能用以下方法模拟克罗克福德的Object.create shim http://javascript.crockford.com/prototypal.html,因为当new
运算符与构造函数一起使用,该构造函数具有prototype
属性包含null
-或任何其他非对象值-,新创建的对象将继承自Object.prototype
无论如何默认。
在一些实现中——V8、Spidermonkey、Rhino 等……——它们有一个可设置的__proto__ https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/proto属性可用于设置null
[[Prototype]],但同样,这是非标准的,并且肯定它永远不会在 IE 上运行。
如果您想针对旧浏览器,我建议不要使用这些功能,因为没有办法让它们在这些环境中正常工作。
如果您还想使用Object.create
,不使用特性争论,你可以,但是我建议你检测那些无法模仿的东西。
以下将是一个safer的版本克罗克福德的Object.create shim http://javascript.crockford.com/prototypal.html:
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;
};
})();
}
无论如何,请谨慎使用。