首先看一段代码,定义一个构造函数Parent 和 Child, new一下Child构造函数创造出实例对象child1.
然后
这里说明实例是个对象,一定要注意
prototype:
prototype属性也叫原型对象,主要是为了实现继承和共享属性;
可以说我们的每一次编程,内在都有原型对象来发挥着作用,如果你没有掌握原型对象的含义,那么你的js还没有真正的入门!
这里记住:对象分为函数对象与普通对象;除函数对象之外的对象全部是普通对象!
只有函数对象才具有prototype属性!;而系统内置的函数对象有:
Function,Object,Array,String,Number
proto
所有的对象obj都具有proto属性(null和undefined除外),可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,也就是指向该构造函数的prototype属性
constructor
构造器,谁创造了该函数,就有该函数的constructor指向构造者!
看完不理解没关系,接着看代码:
由于child1为一个实例对象,对象!是没有peototype属性的!,所以为undefined!
而child1实例对象的__proto__方法打印出来了一个对象,由于是Child创造了child1,所以child1的构造者是Child,也就是指向了Child函数;由于child1为一个对象,那么它的__proto__自然指向Object。
因为Child为构造函数,所以它的__proto__指向者自然是函数;ƒ () { [native code] } 是什么?
native code 的意思是它是程序自带的,是二进制编译的无法显示出来代码, 这里简单了解即可,反正知道是个函数就可以了,不过一般来说,只有实例对象才调用__proto__去寻找原型,但是所有的对象都是有这个属性的!
然后可以看到Child打印的原型对象,要了解原型对象,首先要知道原型对象是怎么创造出来的:
这里也可以知道,为什么prototype是一个对象,是因为在创造的过程中是通过new Object,是作为Object的一个实例创建的;最重要的是:可以看出Child.prototype指向的是Child的一个实例,实例在这里是temp,所有temp是由Chil创造出来的,所以temp(也就是Child.prototype)的构造者是function Child();
而Parent与Child的不同不过是加了个getName方法而已
这里可以再补充一下:一般来说,peototype都是属于普通对象,但是Function的prototype是函数对象,原因是什么呢:
可以看一下Function的prototype的创建过程:可以看出,Function的创建实例是个anonymous function!所以说它的prototype是函数对象
接着看:
在这里相信就比较容易理解了,Child.prototype指向的是一个Child实例对象,其__proto__为Object,而根据__proto__指针指向的是prototype属性,所以可以看到 Child.prototype.proto ===Object.prototype!
下面再看一下Function:说明到达了原型链的最顶端!
构造器的话:构造Child的是Function,构造Child.prototype的是Child,这个现在应该很好理解了.
此外
文章参考自:https://www.h5w3.com/44891.html