js中的原型、原型链和constructor属性

js中的原型和constructor属性

每一个函数都有一个prototype属性,该属性的内部有一个指针指向一个对象,所指向的对象称为原型对象。
注意:不管是普通函数还是构造函数都有一个prototype属性
用构造函数创建一个实例对象,该对象内部也有一个指针,指向原型对象,内部指针为[[prototype]],对外是不可见的。而原型对象内部也有一个指针,指向它的原型,这就构成了一条原型链,所有的对象都继承即*父对象Object。但是浏览器厂商实现了让你可以看到其原型对象的方法,为__proto__,不同的浏览器可能会有所不同

function Student(){
	this.age = 23;
}
Student.prototype.name = 'jack'
var s1 = new Student();

可以通过下列方式查看原型对象

console.log(Student.prototype)
console.log(s1.__proto__);
console.log(s1.__proto__ === Student.prototype) //true
第三行代码为true,可以看到实例对象的指针确实指向了原型对象

每一个对象都有一个constructor属性,函数也是对象,该属性指向的是用于创建该对象的构造函数,所引用的值是创建该对象的那个构造函数的原型对象中的constructor的值。

事实上,实例对象和构造函数上的constructor属性并不是自身所拥有的,而是通过引用得到的(通过原型链),是继承过来的。通过以下代码可以很清楚的看到

console.log(s1.hasOwnProperty('constructor'))   //false
console.log(Student.hasOwnProperty('constructor'))  //false
//Student函数是通过构造函数Function所得到的
console.log(s1.constructor === Student.prototype.constructor) //true
console.log(Student.constructor === Function.prototype.constructor)  //true

下图是我画的有关实例对象、原型对象以及原型链的关系图
js中的原型、原型链和constructor属性