什么是原型
什么是原型(实例
任何对象实例都有一个原型,也叫原型对象,这个原型对象由对象的内置属性_proto_指向它的构造函数prototype指向的对象,及任何对象都是由一个构造函数创建的,但是不是每一个对象都有prototype,只有方法才有prototype。
js每个函数都有一个prototype属性,prototype指向一个对象,当函数当作构造函数时,prototype起到了类似class的作用
什么是原型链
原型链基本思想是利用原型让一个引用类型继承另外一个引用类型的属性和方法。我们知道,每个构造函数都有一个原型对象,每个原型对象都有一个只想构造函数的指针,而实例又饱含一个指向原型对象的内部指针。
原型链的核心就是依赖对象的_proto_的指向,当自身不存在的属性时,就一层层地拔出创建的对象的构造函数,直到Object时,就没有_proto_指向。
prototype起到类似与其他语言class的作用
因为_proto_实质找的是prototype,所以我们只要找到这个链子上的构造函数的prototype。其中OBject.prototype是没有_proto_属性的,他==null。
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含指向原型对象的内部指针。我们让原型对象A等于另一个原型对象的实例B,此时原型对象B将包含另一个原型对象的实例A,再让原型对象B的实例等于原型对象C,如此递进后成了实例和原型链的概念(互相共享,包含)
A指向B(实例对象) == A继承B的属性和方法,所以B和A共享即有一个内部指针B实例指向C C也包含了B
原型继承是js的一种继承方式,原型链是继承的主要方式,其思路就是利用原型让一个引用类继承另外一个类的属性和方法
原型继承:原型成员可以被和其相关的对象共享同意特性,可以实现继承,这种继承方式就叫原型继承(继承衣钵
实例都有_proto_指向构造函数,构造函数可以通过prototype来继承共享
普通函数与构造函数的区别
- 构造函数也是普通函数,创建方式与普通函数相同
- 调用方式不同,普通函数直接调用,构造函数需要new
- 调用不同,构造函数内部会创建一个新对象(实例,普通函数不会
- 构造函数内部this指向实例,普通函数指向调用函数的对象(顶层为window
- 构造函数名与类名相同,返回值不同,构造函数返回实例,普通函数根据业务逻辑return返回