ECMAScript6 怎么写class么
这个语法糖可以让有 OOP 基础的人更快上手 js 至少是一个官方的实现了
但对熟悉 js 的人来说 这个东西没啥大影响 一个 Object.creat() 搞定继承 比 class 简洁清晰的多
Javascript如何实现继承
1、原型链继承
弊端:
1)无法传参
2)继承的属性 无法在子类对象自身看到
3)获取引用时 会造成引用混乱的问题
2、借用构造函数继承
3、组合式继承
4、原型式继承
5、寄生式继承
6、寄生式组合继承
简述继承的作用
继承可以帮助我们将重复的代码和逻辑抽取到父类中 子类只需要直接继承过来使用即可
复用代码、缩短开发周期、降低开发费用
类的继承
使用 extends 关键字实现类的继承
super关键字用于访问和调用对象父类上的函数,可以调用父类的构造函数,也可以调用父类的普通函数
子类在构造函数中使用super,必须放到this前面(必须先调用父类的构造方法,在使用子类构造方法)
子类中可以定义与父类中重名的方法,此时子类中方法会遮蔽父类中的同名方法
原型继承的实现思路
Function Person(name,age){
this.name = name;
this.age = age;
}
Function Man(){
}
Man.prototype = new Person();
类中的成员分属
公有属性属于类的实例对象 通过 this 赋值给实例对象
类中方法属于类的原型对象 所有类的实例对象都可以使用
静态成员属于类本身 不属于任何实例对象
类的静态成员
静态成员是指在方法名或属性名前面加上 static 关键字 和普通方法不一样的是 static修饰的方法不
能在实例中访问,只能用类名直接访问
类的构造函数
构造函数也是类中的一个方法 只不过是一个特殊的方法
constructor()方法是类的构造函数(默认方法) 用于传递参数 返回实例对象 通过new命令生成对象
实例时 自动调用该方法 如果没有显示定义 类内部会自动创建一个构造函数
类的公有属性放到构造函数中进行初始化
class Student{
constructor(username,age){
this.username = username;
this.age = age;
}
}
能够改变this指向的方法
改变函数有 call、apply 和 bind 三个方法 区别在于
1.call 和 apply 在调用时 函数会执行 而 bind 在调用时会返回一个新的函数 需要进行手动调用
2.call 和apply 再使用基本类似 但是在传参的时候 call 能够从第2个参数开始接收一个参数序列
a,b,c.. apply方法在传参时需要将第二个参数设置为数组
this绑定的几种方式
1、默认绑定:全局环境中this默认绑定到window
2、隐式绑定:一般的 被对象所包含的函数调用时 也称为方法调用 this隐式绑定到该对象
3、显示绑定:通过call()、apply()、bind()方法把对象绑定到this上 叫做显式绑定
4、new绑定:如果函数或者方法调用之前带有关键字new 它就构成构造函数调用 对于this绑定来说 称为new绑定
1)构造函数通常不使用return关键字 它们通常初始化新对象 当构造函数的函数体执行完毕时 它会显式返回 在这种情况下 构造函数调用表达式的计算结果就是这个新对象的值
2)如果构造函数使用return语句但没有指定返回值 或者返回一个原始值 那么这时将忽略返回值 同时使用这个新对象作为调用结果
3)如果构造函数显式地使用return语句返回一个对象 那么调用表达式的值就是这个对象
简述什么是原型链
原型对象也有一个自己的原型对象([[Prototype]]) 层层向上直到一个对象的原型对象为 null根据定义 null 没有原型 并作为这个原型链中的最后一个环节
原型的理解
每一个函数都会被分配一个 prototype 属性,指向一个对象 此对象成为函数的原型对象 这个对象的所
有属性和方法都会被构造函数所拥有
默认情况下创建函数时 函数的原型上都会添加一个属性叫做constructor 这个constructor指向当前的函数对象
原型对象与函数对象之间的关系:你中有我 我中有你
原型、原型对象和对象的关系
每一个函数都有一个 prototype 属性,指向此函数的原型对象
每一个对象都有一个[[Prototype]]属性指向对应构造函数的原型对象
函数的原型对象有一个 constructor 属性指向对应的构造函数
属性描述分类
数据属性描述符和存取属性描述符
数据属性描述符特性
configurable:属性是否可以通过delete删除属性 是否可以修改它的特性 或者是否可以将它修改为存取属性 取值true和false
Enumerable:表示属性是否可以通过for-in或者Object.keys()返回该属性
Writable:表示是否可以修改属性的值
value:属性的value值 默认为undefined
数据存取属性描述符特性
Configurable:表示属性是否可以通过delete删除属性 是否可以修改它的特性 或者是否可以将它修改为存取属性.
Enumerable:表示属性是否可以通过for-in或者Object.keys()返回该属性
get:获取属性时会执行的函数 默认为undefined
set:设置属性时会执行的函数 默认为undefined