## 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对象这一层
- 空白目录
- window
- location
- history
- DOM
- 什么是DOM
- JS盒子模型
- 13个核心属性
- DOM优化
- 回流与重绘
- 未整理
- 文档碎片
- DOM映射机制
- DOM库封装
- 事件
- 功能组件
- table
- 图片延迟加载
- 跑马灯
- 回到顶部
- 选项卡
- 鼠标跟随
- 放大镜
- 搜索
- 多级菜单
- 拖拽
- 瀑布流
- 数据类型的核心操作原理
- 变量提升
- 闭包(scope)
- this
- 练习题
- 各种数据类型下的常用方法
- JSON
- 数组
- object
- oop
- 单例模式
- 高级单例模式
- JS中常用的内置类
- 基于面向对象创建数据值
- 原型和原型链
- 可枚举和不可枚举
- Object.create
- 继承的六种方式
- ES6下一代js标准
- babel
- 箭头函数
- 对象
- es6勉强笔记
- 流程控制
- switch
- Ajax
- eval和()括号表达式
- 异常信息捕获
- 逻辑与和或以及前后自增
- JS中的异步编程思想
- 上云
- 优化技巧
- 跨域与JSONP
- 其它跨域相关问题
- console
- HTML、XHTML、XML
- jQuery
- zepto
- 方法重写和方法重载
- 移动端
- 响应式布局开发基础
- 项目一:创意简历