原型(prototype):
prototype是属于函数的一个空间,它是一个对象。因为构造函数也是函数所以它也具备。而这个prototype属性我们称为显式原型。
函数的prototype:
实例对象访问对于的prototype上的内容可以通过实例对象.属性名访问一般将对应的函数存储在对应prototype上(这个函数只会声明一次)。将函数存储在原型,将属性放在构造函数里面。在prototype里面声明的函数的this指向当前的调用的实例对象
__proto__:
__proto__称为隐式原型,它是属于对象的一个空间,每个对象都存在这个空间,那么对应的实例对象也是一个对象,所以它也有这个空间。这个空间指向对应的构造函数的prototype.
__proto__的指向:
__proto__指向对应的构造函数的prototype构造函数也是一个对象那么它的__proto__指向谁指向对应的父类的构造函数的prototypeObject的__proto__指向null
原型链:
原型链 (解决构造函数的缺陷)
1.先找自己的__proto__ (对于的构造函数的prototype)
2.再找对应的自身构造函数的原型的__proto__找到父类构造函数的原型
再找对应的父类的原型的__proto__ ,直到找到object为止
3. Object的原型的__proto__(null)上还找不到返回undefined
Object.prototype.hello='你好'
class Person{
constructor(){
this.name='张三'
}
}
Person.prototype.sex='女'
Person.prototype.username='rose'
class Son extends Person{
constructor(){
super()
this.age='李四'
}
}
Son.prototype.sex='男'
//实例化
var son =new Son()
console.log(son.age);//李四
console.log(son.name);//张三
console.log(son.username); //rose
console.log(son.sex); //男
console.log(son.hello); //你好
console.log(son.hi); //undefined
原型重写forEach高阶函数:
数组的原型
在数组的原型上添加一个myForEach的方法
在对应的原型上的函数里面的this指向当前调用的实例对象
原型重写map高阶函数:
原型重写reduce高阶函数:
继承:
ES6新增的继承:
缺点:会有兼容问题,低版本浏览器不适用
优点:代码结构清晰,方便阅读
原型继承:
缺点:会覆盖原型上的私有的属性和方法,在原型上重复出现一样的属性.
核心 :在子类的原型上创建父类的对象
对象冒充继承:
缺点:不能继承原型上的方法:
核心: 在子类中调用父类的构造函数 ,更改this的指向
组合继承:
优点: 使用了对象冒充+原型连接继承的结合
组合寄生继承:
(对象冒充+原型链继承 (创建一个原型对象放在原型链上))
核心: 在子类的原型上创建父类的原型对象
ES6的模块化:
模块的思想,将对应的功能代码封装为一个模块(js代码 css代码 html代码)。想要使用别人就导入,想要给别人用就导出。复用
模块化的常用的模式:
amd (在对应的加载之前导入)
cmd (在用的时候导入)
comment.js (基于amd和cmd之上)
es6的模块化的关键词 :
import 导入
export 导出
注意: 必须要先导出才能导入
第一种export default用法:
导出 (默认导出只能有一个)
第二种导出 export(多个) :
如果直接使用对应的export 导出name通过{键}来接收
第三种导出(根据变量)