多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## Object.create(IE9+) ### 问题抛出 ``` var obj = { getX:function(){ } }; function Fn(){ } Fn.prototype = obj; ``` ![](https://box.kancloud.cn/f680b1fa79c29d48caa44597f1709cfb_313x129.png) 因为更改了原本prototype的堆内存,自定义的又没有constructor,So,我们发现 ![](https://box.kancloud.cn/c4dcf592191e273d8f51fd7b8c04c482_387x93.png) 最终会指向`Object类` ``` var obj = { constructor:Fn ,getX:function(){ } }; function Fn(){ } Fn.prototype = obj; Fn.prototype.sum = function(){} //此时Fn.prototype和obj都指向同一块内存,嗯,不大好 var obj2 = {}; for(var key in obj){ if(obj.hasOwnProperty(key)){ obj2[key] = obj[key]; } } //将拷贝出来的新内存空间obj2的地址再赋给prototype即可 ``` 嗯,为了解决这个问题,ecma5提供了一个新API ### Object.create 该方法创建一个拥有指定原型和若干个指定属性的对象 ``` Object.create(proObj) //创建一个新的对象,但是还要把proObj作为这个对象的原型 ``` ``` var obj = {getX:function(){}}; var obj2 = Object.create(obj); //->obj2 //__proto__: // getX:function(){} // __proto__:Object.prototype obj2.getX(); obj.getY = function(){console.log(2)}; obj2.getY(); //2 ``` Object.create实现 ``` function object(obj){ function Fn(){}; Fn.prototype = obj; return new Fn; } ``` 正常时使用 ``` function Sum(){} Sum.prototype = Object.create(obj); Sum.prototype.constructor = Sum; ``` 好处就是Sum.prototype和obj并不会指向同一个内存空间(不在一个层级); 这样我们修改Sum的prototype,并不会直接影响到obj对象这一层