Object.create(obj)是用来创建一个对象,该对象的原型是参数obj,但是在较低版本的IE浏览器中是不支持该函数的。那么应该如何对浏览器兼容性进行校验呢?
使用__proto__
引发的问题
我们在google浏览器上进行调试的时候,发现对象都会有
__proto__
这个属性,但是当你想到用这个属性来操作原型对象的时候,时常会引发一些问题,例如较低版本的IE浏览器不支持这个属性,另一方面,我们一般不直接使用这个属性来操作原型对象。原型对象不只是被一个对象占有,那么当你用当前对象的__proto__
来操作原型对象的时候,就在语义上默认了该原型只属于当前对象。下面来看一种错误的写法。
错误写法一
如果浏览器不支持,直接将该方法添加到Object原生构造函数中。这种写法也是错误的,虽然你也能用该写法实现你的需求,但是在浏览器更新之后,可能会引发某些问题。这里举个简单的例子,假设低版本的浏览器中没有这个函数,而较高版本的浏览器中却实现了这个函数,但是官方的实现的函数却不是你想要的功能,可能他们提出的Object.create(obj)可能是实现一个浅拷贝,这个时候,就会出现某些问题。
if(Object.create){ //如果浏览器存在当前属性
//...
}else{ //如果浏览器不存在当前属性,那么就给他添加一个属性
Ojbect.create = function(){
//...
}
}
错误写法二
通过
__proto__
引发的问题。
前面已经提到果使用__proto__
引发的问题,这里就不再赘述。
//写法一
var o = {};
o.__proto__ = obj;
错误写法三(写法二变种)
function createObject(obj){
if(Object.create){
return Object.create(obj);
}else{
var o = {};
o.__proto__ = obj;
return o;
}
}
正确写法
function CreateObject(obj){
if(Object.create){
Object.create(obj);
}else{
function F(){}
F.prototype = obj;
return new F();
}
}