什么是原型?
可以理解成制作时依赖的参照物,比如说,有人对着你画了一张你的画像,那么你本人就是这张画像的原型,如果再有人仿造你的画像又画了一幅,那么你的画像就是这个人仿画的原型。
画像装不下的盛世美颜还可以以你为原型搞一些雕塑,当然这里不管画像还是雕塑终极都是以你本人为原型。那你本人的原型呢,是指向基因的,这就由表面指向内部生物性,性质上发生了很大变化,我们当做到这里停止了。
以上这些放在 js 世界里可以这么解释。
有一个对象原型我们称为 Object.prototype (把它当成上面的你本人), Object.prototype 的原型就指向 null(理解成上面的基因) 为最终停止,null 就没有原型了,但仍然与 Object.prototype 有关,代表一个特殊的对象原型。如果要创建其他对象我们都会以这个 Object.prototype 为原型,比如随便两个:
var obj={};
var obj2=Object.create(obj);
Object.getPrototypeOf(obj)===Object.prototype // true
Object.getPrototypeOf(Object.getPrototypeOf(obj))===null // true
Object.getPrototypeOf(obj2)===obj // true
虽然这里 obj 是一个空对象 ,可以用 js 的内置方法 Object.getPrototypeOf(obj) 获取到 obj 的原型,仍然是 Object.prototype,当然可以试试 Object.getPrototypeOf 获取 Object.prototype 的原型是 null。
还有用 Object.create 这个方法新建了一个对象,所以新对象的原型指向 obj,那 obj2 这里就有一条线是 obj2的原型属性指向 obj,obj的原型指向 Object.prototype ,最终指向null,我们就称这条线为 原型链。
因为 js 里的原型都是对象,原型跟原型对象实际上是同一个概念。
到这里原型、原型对象和原型链就说完了,下面补充点其他内容。
之前在 js的new运算符详解 这篇文章里说过创建对象的三种方法,刚刚举例说了两种还有第三种如下:
var obj3=new Object(obj);
Object.getPrototypeOf(obj3)===Object.prototype // true
那么 obj2 和 obj3 的区别就是,obj2是原型指向 obj 的空对象,而 obj3 是将 obj 的引用地址赋值给了 obj3,它等同于 obj 。所以,Object.getPrototypeOf(obj3)===Object.prototype 返回 true。
感谢阅读,喜欢的话点个赞吧:)
更多内容请关注后续文章。。。