由Object.create(obj)引发的思考

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();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_25956141/article/details/81910146