面向对象
面向对象编程简称 oop,关注一个需求实现的步骤,分析一步步的业务逻辑,逐步实现
js 的面向对象的特性 :封装、继承、(没有多态)
js 只有单线程,没有多线程
构造函数
通过构造函数创建对象时,如果把方法放到实例对象身上,会导致创建多个对象时,方法也跟着创建多个,造成内存的浪费
缺点:所有的方法都一样时,会导致内存浪费
js 面向对象中的封装性,是借助构造函数来实现的
原型对象 prototype
什么是原型对象:所有的构造函数都有一个属性:prototype 这也是一个对象,称为原型对象
特点:
1.所有通过构造函数创建出来的实例对象,都可以访问原型对象中的成员
2.实例创建再多,都不会重复创建原型对象,每个构造函数的原型对象都是唯一的,因为它是随着构造函数的走的
3.对象会优先找自己身上的属性和方法
公共的属性和方法放在原型上,这是不变的原则
原型中的 this
原型对象中方法的 this 指向:调用者,实例对象
注意事项:
1.构造函数不能是箭头函数,因为箭头函数 this 的指向 和当前环境有关
2.原型的函数要根据情况判断,如果用了箭头函数意味着 this 不在是实例对象(可以理解为箭头函数内没有 this)
原型对象中的 constructor
原型对象 和 constructor 相互引用
原型 proto
__proto__ 原来是 JS非标准属性,但是 es6 规范中开始标准化
[[prototype]]和 __proto__意义相同
原型链 instanceof
instanceof 一般可以判断具体的引用数据类型,比 typeof 更准确,typeof一般用于判断基本数据类型,判断 引用数据的结果都是 object,不会返回具体的 ,而 instanceof 会返回 具体的(例如 Array)
用来检测构造函数.prototype 是否存在于实例对象的原型链上
instanceof 的返回值是 布尔值
原型继承
总结:
1.创建父级构造函数
2.将所有公共的方法放到父级的原型对象上
3.将子级构造函数的原型对象指向 父级构造函数创建的 实例对象