当前位置: 代码迷 >> 综合 >> JS小计--面向对象
  详细解决方案

JS小计--面向对象

热度:45   发布时间:2024-02-12 08:35:31.0

面向对象:是一种编程思想,JS本身就是基于面向对象构建出来的,JS中类和实例是基于原型和原型链机制来处理的。Java中面向对象有封装继承与多态这三个特点,js也一样。

封装:低耦合,高内聚

多态:多态又分为重写和重载,重写是指在类的继承中,子类重写父类的方法。重载则是指方法名相同,形式参数个数或者类型不一直[JS不存在真正意义上的重载,JS重载指的是同一个方法,根据传参不同来实现不同的效果]

继承:子类继承父类的属性和方法

 

关于js的继承,只要想记录以下几点

原型继承。让父类中的属性和方法在子类实例的原型链上,子类的原型指向父类的实例。

child.prototype = new parent();
child.prototype.constructor = child
//prototype=>公有相关
//constructor=>重定向

特点:

  • 不像其他语言的继承一样(其他语言的继承一般为拷贝继承),JS是把父类的原型放到子类实例的原型链上,实例想要调取这些方法, 是基于_proto_原型链查找几只完成的。
  • 子类可以重写父类上的方法(但也会导致父类其他实例变更)
  • 父类中私有或公有的属性和方法,最后都会变成子类中公有属性和方法

call继承。子类方法中吧父类当做普通函数执行,让父类的this指向子类的实例,相当于给子类的实例设置了很多的私有属性和方法。

特点:

  • 只能继承父类私有的属性或方法(因为是把父类当做普通函数执行,与其原型上的属性和方法无关)
  • 父类私有的属性或方法会变成子类私有的属性或方法

寄生组合继承。call继承+类似原生继承

特点:

  • 父类私有和共有的分别是子类实例的私有和共有属性方法

 

ES6中的继承(属于寄生组合),与前几个继承不同的是ES6的继承是由固定语法的。类似Java继承包含关键字extends

class child extends parent
{constructor(y){super();this.y=y;}getY(){console.log(this.y)}
}
//es6这类写法 类似于b.prototype._proto_= a.prototype
//constructor与super()必须同时存在,在继承中可以不写constructor,一旦写了第一句必须是super.
//若不写,则浏览器会默认创建constructor(...args){ super(...args)}