原型和原型链
在js中,每一个函数类型的数据,都有一个叫做prototype的属性,这个属性指向的是一个对象,就是所谓的原型对象。
1. 显示原型
显示原型就是利用prototype属性查找原型,只是这个是函数类型数据的属性。
2. 隐式原型
隐式原型是利用__proto__属性查找原型,这个属性指向当前对象的构造函数的原型对象,这个属性是对象类型数据的属性,所以可以在实例对象上面使用:
- 构造函数是使用了new关键字的函数,用来创建对象,所有函数都是Function()的实例
- 原型对象是用来存放实例对象的公有属性和公有方法的一个公共对象,所有原型对象都是Object()的实例
- 原型链又叫隐式原型链,是由__proto__属性串联起来,原型链的尽头是Object.prototype
说一下闭包
函数嵌套函数,内部函数就是闭包
闭包就是能够读取其他函数内部变量的函数. 说白了,闭包就是一个函数,只不过是处于函数内部而已
闭包的特性
内部函数没有执行完成,外部函数变量不会被销毁
闭包的作用 :
好处
- 1.访问函数内部的变量
- 2.防止函数内部的变量执行完之后被销毁,实时保存在内存中.
坏处
- 1.耗内存,使用不当会造成内存溢出的问题
js继承方式
一、原型链继承
核心:将父类的实例作为子类的原型。
优点:父类方法可以复用。
缺点:
· 父类的引用属性会被所有子类实例共享
· 子类构建实例时不能向父类传递参数
二、构造函数继承
核心:将父类构造函数的内容复制给了子类的构造函数。这是所有继承中唯一一个不涉及到prototype的继承。
SuperType.call(SubType);
优点:和原型链继承完全反过来
父类的引用属性不会被共享
子类构建实例时可以向父类传递参数
缺点:父类的方法不能复用,子类实例的方法每次都是单独创建的。
二、构造函数继承
核心:将父类构造函数的内容复制给了子类的构造函数。这是所有继承中唯一一个不涉及到prototype的继承。
SuperType.call(SubType);
优点:和原型链继承完全反过来
父类的引用属性不会被共享
子类构建实例时可以向父类传递参数
缺点:父类的方法不能复用,子类实例的方法每次都是单独创建的。
三、组合继承
核心:原型式继承和构造函数继承的组合,兼具了二者的优点。
优点:
父类的方法可以被复用
父类的引用属性不会被共享
子类构建实例时可以向父类传递参数
缺点:调用了两次父类的构造函数,第一次给子类的原型添加了父类的name, arr属性,第二次又给子类的构造函数添加了父类的name, arr属性,从而覆盖了子类原型中的同名参数。这种被覆盖的情况造成了性能上的浪费。