JS面向对象+TS访问修饰符

105 阅读2分钟

JS面向对象

  • 传统的javascript中只有对象,没有类的概念。它是基于原型的面向对象语言。Es5的时候通过构造函数来创建类 到了es6 我们就可以通过class关键字来创建类,跟传统的面向对象的语言更加接近。 ES5中如果要生成一个对象实例,需要先定义一个构造函数,然后通过new操作符来创建实例。

  • ES6中的类

    ES6引入了class(类)这个概念,通过class关键字可以定义类。该关键字的出现使得javascript在对象写法上更加清晰,更像是一种面向对象的语言。

  • 注意项:

1.在类中声明方法的时候,千万不要给该方法加上function关键字

2.方法之间不要用逗号分隔,否则会报错

  • ES5中的继承 (组合继承:原型链继承 + 借用构造函数)
  1. 原型链继承:

父类的实例作为子类的原型

  1. 借用构造函数继承:

在子类内,使用call()调用父类方法,并将父类的this修改为子类的this.相当于是把父类的实例属性复制了一份放到子类的函数内.

  1. 组合继承:

既能调用父类实例属性,又能调用父类原型属性

image.png

 

  • 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

image.png

  • 继承该类的子类不能访问
class Father {
    private name :String
    constructor(name:String){
        this.name=name
    }
}

class Son extends Father{
    say(){
        console.log(`我的名字是${this.name}`);
    }
}

image.png

受保护修饰符

  • 跟私有修饰符很相似,实例对象同样不能访问受保护的属性
class Father {
    protected name :String
    constructor(name:String){
        this.name=name
    }
}

const father =new Father('huihui')
father.name

image.png

  • protected 成员在子类中仍然可以访问
class Father {
    protected name :String
    constructor(name:String){
        this.name=name
    }
}

class Son extends Father{
    say(){
        console.log(`我的名字是${this.name}`);
    }
}

public

  • 公开的在哪都能访问