var xl = new Student(18,‘小熊’);
var wh = new Student(17,‘王欢’);
xl.score();
当打印这个构造函数创建的实例时,可以发现:
console.log(xl);
我们创建的这个实例继承了该构造函数的属性和方法。
可以表示为:
再打印实例对象看内部有哪些属性。
console.log(xl);
可以发现,该实例内部具有一个对象原型__proto__
,并且其指向构造函数的原型对象。
尝试调用实例对象的score
方法
xl.score()
调用成功,可是xl
实例对象上并没有该方法,那么,它是如何调用的呢?
接下来,我们先判断实例对象的对象原型和构造函数的原型对象是否相等
console.log(xl.proto === Student.prototype);
打印结果为:
二者相等。所以,我们明白了:当我们要得到实例对象xl的score
方法时,首先看xl
对象身上是否具有score
这个方法,因为有__proto__
的存在,就去构造函数原型对象prototype
身上去查找该方法。
可以得到如下的图示:
不管打印构造函数的prototype
还是实例对象的__proto__
,我们都可以发现他们都有一个constructor
属性。并且都指向Student
构造函数。
console.log(Student.prototype);
console.log(xl.proto);
所以我们又可以得到下图:
我们知道Student原型对象prototype也是一个对象,而每一个对象都有__proto__
属性,我们来打印一下,看看是否可以得到__proto__
属性
console.log(Student.prototype);
可知该对象的确有一个__proto__
属性,并且指向Object
对象,而且在它的内部,又有一个contructor属性,指向Object
原型对象prototype
。
通过下述代码验证:
console.log(Student.prototype.proto === Object.prototype);
得到的结果为:
所以我们又可以得到下图:
同理,我们可以知道object原型对象prototype
是由Object
构造函数创建的,并且该构造函数可以通过prototype
对象得到该原型对象。故而,该原型对象里面还有一个constructor
属性指向Object
构造函数。
可以得到:
最后,我们的Object
原型对象prototype
又指向什么呢?
输出如下代码: