Dre*_*rew 8 javascript ecma262 prototypal-inheritance ecmascript-5
我正在看到有关"新"Object.create的帖子,它使枚举可配置.但是,它依赖于Object.defineProperty方法.我找不到这种方法的跨浏览器实现.
我们是不是在为旧的Object.create写作?我不能写出在IE6/7中无效的东西.
CMS*_*CMS 14
在Object.create
ECMAScript 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)
无论如何,请小心使用它.
归档时间: |
|
查看次数: |
5735 次 |
最近记录: |