JS面向对象
-
传统的javascript中只有对象,没有类的概念。它是基于原型的面向对象语言。Es5的时候通过构造函数来创建类 到了es6 我们就可以通过class关键字来创建类,跟传统的面向对象的语言更加接近。 ES5中如果要生成一个对象实例,需要先定义一个
构造函数,然后通过new操作符来创建实例。 -
ES6中的类
ES6引入了class(类)这个概念,通过class关键字可以定义类。该关键字的出现使得javascript在对象写法上更加清晰,更像是一种面向对象的语言。
-
注意项:
1.在类中声明方法的时候,千万不要给该方法加上function关键字
2.方法之间不要用逗号分隔,否则会报错
- ES5中的继承 (组合继承:原型链继承 + 借用构造函数)
- 原型链继承:
父类的实例作为子类的原型
- 借用构造函数继承:
在子类内,使用call()调用父类方法,并将父类的this修改为子类的this.相当于是把父类的实例属性复制了一份放到子类的函数内.
- 组合继承:
既能调用父类实例属性,又能调用父类原型属性
-
Es6的继承
Class cat extends 父类
然后在constructor中定义super 可以设置继承父类的哪些属性
-
特性
继承性 多态性 封装性
ES6继承的实现
class Person {
name;
age;
constructor(name, age) {
this.name = name
this.age = age
}
say() {
return `我的名字叫${this.name},今年${this.age}岁`;
}
}
let p = new Person('李四', 24)
console.log(p.say());
class Worker extends Person {
money;
constructor(name,age,money){
super(name,age)
this.money=money
}
fn() {
return `我是${this.name},我喜欢玩`
}
salary() {
return `我叫${this.name},${this.age}岁了`
}
qian(){
return `我叫${this.name},今年${this.age}岁了,工资${this.money}元!!!`
}
}
let p2 = new Worker('张三', 25,1000)
console.log(p2.fn());
console.log(p2.salary());
console.log(p2.say());
console.log(p2.qian());
TS访问修饰符
- private:在当前类中定义的属性和方法
- protected:访问当前类和子类
- public:当前类、子类和实例化对象
| 当前类 | 子类 | 实例化对象 | |
|---|---|---|---|
| private 私有 | 可以 | ||
| protected 受保护的 | 可以 | 可以 | |
| public 公开的 | 可以 | 可以 | 可以 |
私有修饰符
- 只能够在该类的内部进行访问,实例对象并不能够访问
class Father {
private name :String
constructor(name:String){
this.name=name
}
}
const father =new Father('huihui')
father.name
- 继承该类的子类不能访问
class Father {
private name :String
constructor(name:String){
this.name=name
}
}
class Son extends Father{
say(){
console.log(`我的名字是${this.name}`);
}
}
受保护修饰符
- 跟私有修饰符很相似,实例对象同样不能访问受保护的属性
class Father {
protected name :String
constructor(name:String){
this.name=name
}
}
const father =new Father('huihui')
father.name
protected成员在子类中仍然可以访问
class Father {
protected name :String
constructor(name:String){
this.name=name
}
}
class Son extends Father{
say(){
console.log(`我的名字是${this.name}`);
}
}
public
- 公开的在哪都能访问