一道笔试题引发的对Object.creat()的思考

今天晚上参加了酷家乐的笔试,有一道选择题让我有点犹豫,现在放出来让大家先思考一下。

(凭记忆敲出来的代码,有错望雅正)

凭上面的这段代码,我们可能首先会想 a 和 b 是不是引用同一个对象,从Object.create( )这个方法来讲,它应该是创建一个新的对象,所以不应该是引用同一个对象,那么排除引用同一个对象的可能。那有没有可能是对象的复制呢,如果我们把这个过程看做是对象的复制,那么控制台的输出结果应该是:  1,3

我们现在公布控制台的输出结果:

结果是不是跟我们预料的有点不太一样,我们先去MDN看一下它是怎么解释Object.create( )的。

 

下面是来自MDN官方的解释:

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

 

所以根据结合官方文档的解释题目我们可以理解成这个创建的新对象 b 它的原型指向了 a,一开始打印的 b.foo 并不是 b 自己的 foo 属性,而是 a 的 foo 属性,要证明这一点非常容易,我们可以使用hasOwnProperty方法去检测 foo 是否是 b 自身的属性。

下面是实例代码

控制台输出结果:

结果显示很明显了,也证明一开始打印的并不是 b 自身的 foo 属性,而是 a 的 foo 属性,后面 b.foo = 3; b才拥有自己的 foo 属性,所以打印出来是3。

 

  关于Object.create( )方法,它的用法不止于此,它可以用来实现Java的那种继承的思想(通过原型链的方式),当我们通过new去创建一个对象的时候也会发生同样的现象,也就是新new的这个对象的原型会指向构造这个对象的函数的prototype属性,而prototype属性本身就是一个对象,这中间的指向其实就构成了一个原型链,我们在调用一个对象的属性或方法的时候,会先从它的自身属性开始找,找不到就沿原型链向上查找。所以当我们用字面量 var a = { };创建一个“空”对象时,我们也可以把它等价于var a = Object.create(Object.prototype);

 

注解:这里的“空”打了双引号是想说明 a 实际并不是一个空的对象,它只是没有自身的属性,但是它能调用Object.prototype定义的方法,而Object.create( null )则是个完全空的对象,它并不能调用Object.prototype定义的方法,因为它创建的对象原型指向了null,所以想要创建一个“空”的对象就要记得不要用Object.create( null )啦。

猜你喜欢

转载自www.cnblogs.com/popo-go/p/8969783.html