关于Object.create()

昨晚在看到 Object.create()的时候,因为书中的一些内容产生误解。

那么 Object.create() 是什么东西呢?

官方的解释: Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。 

下面是我的拙劣的理解:

首先Object.create() 提供了两个参数 第一个是 __proto__ 对象 , 第二个是 prototiesObject(可选。如果没有指定为 undefined,则是要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数)。然后这个方法它会将__proto__添加到返回的新对象当中,并且在你添加第二个参数时,它会按照这个对象的配置配置你的__proto__。

那既然它会帮助我们创建实例原型对象,那是不是可以用来实现继承呢?

当然是可以的,请看下面代码

var __proto__ = {
    name: 'yang',
    friend: [1, 2, 3]
}
var newObj = Object.create(__proto__);
console.log(newObj.hasOwnProperty('friend'))          // false
var newObj1 = Object.create(newObj);
newObj1.friend.push(1)
console.log(newObj1.friend)           // 1 2 3 1

首先我为newObj 添加了 一个 __proto__对象作为它的原型对象,为了验证这个Object.create(),我使用hasOwnProperty来验证这个方法。接着我再创建了一个 newObj1对象 用这个Object.create() 传入newObj 作为它的实例原型对象。

这样就完成了一个简单的继承。newObj1.__proto__ 指向 newObj , newObj.__proto__ 指向 __proto__对象。

支持 Object.create()方法的浏览器有 IE9+Firefox 4+Safari 5+Opera 12+Chrome。在没有必要兴师动众地创建构造函数,而只想让一个对象与另一个对象保持类似的情况下,原型式继承(上面使用的继承方法)是完全可以胜任的。不过别忘了,包含引用类型值的属性始终都会共享相应的值,就像使用原型模式一样。

就这些啦

猜你喜欢

转载自blog.csdn.net/yang52ya7/article/details/80203457