构造函数原型 prototype
构造函数通过原型分配的函数是所有对象共享的
Js规定,每一个构造函数都有一个prototype属性,指向另一个对象,这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有
我们把不变的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法
原型是什么?
一个对象,也称prototype为原型对象
原型的作用?
共享方法
一般情况,公共属性定义到构造函数里面,公共的方法我们放到原型对象身上
对象原型_proto_
对象都会有一个属性_proto_指向构造函数的prototype原型对象,之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有_proto_原型的存在
- _proto_对象原型和原型对象prototype是等价的
constructor 构造函数
对象原型(_proto_)和构造函数(prototype)原型对象里面都有一个constructor属性,constructor我们称为构造函数,因为它指回构造函数本身
构造函数、原型对象、实例三者的关系
原型链
JS成员查找机制
-
当访问一个对象属性(或方法)时,先查找该对象自身有没有该属性
-
如果没有就查找它的原型(_proto_指向的prototype原型对象)
-
如果还没有就查找对象的原型(Object的原型对象)
-
依次类推,一直找到Object为止(null)
-
_proto_对象原型的意义就在于为对象成员查找机制提供一个方向
原型对象this指向
不管是构造函数的this还是原型对象的this都是指向实例对象
扩展内置对象
数组和字符串内置对象不能给原型对象覆盖操作Array.prototype = {},只能是Array.prototype.xxx=function(){}
call()
fun.call(thisArg,arg1,arg2)
- thisArg:当前调用函数this的指向对象
- arg1,arg2传递的其他参数
类的本质
class本质还是function,也可以理解是构造函数的另外一种写法
类的所有方法都定义在类的prototype属性上
类创建的实例,里面也有_proto_指向类的prototype原型对象