typescript封装属性publicprivateprotectedconstructorgetsetextends

Posted web半晨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了typescript封装属性publicprivateprotectedconstructorgetsetextends相关的知识,希望对你有一定的参考价值。

// 自执行函数的作用是形成单独模块(块作用域),
// 防止此文件的变量或方法与其他文件的属性或方法冲突
(function () 
    // 可以任意修改类中属性的值
    class ArbitrarilyEdit 
        name: string;
        age: number;

        constructor(name: string, age: number) 
            this.name = name;
            this.age = age;
        
    

    let arbitrarilyEdit = new ArbitrarilyEdit('半晨', 24);

    // 在对象中直接设置属性
    // 属性可以任意的被修改
    // 属性可以任意被修改将会导致对象中的数据变得非常不安全
    console.log('before-arbitrarilyEdit:', arbitrarilyEdit);
    // before-arbitrarilyEdit: ArbitrarilyEdit name: "半晨", age: 24
    arbitrarilyEdit.name = '舒冬';
    arbitrarilyEdit.age = -33;
    console.log('after-arbitrarilyEdit:', arbitrarilyEdit);
    // arbitrarilyEdit: ArbitrarilyEdit name: "舒冬", age: -33

    // 定义一个不可以任意修改类中值的类
    class Person 
        // typescript可以在属性前添加属性的修饰符
        // public 修饰的属性可以在任意位置访问(修改) 默认值
        // private 私有属性,私有属性只能在类内部进行访问(修改)
        // 通过在类中添加方法使得私有属性可以被外部访问
        // protected 受包含的属性,只能在当前类和当前类的子类中访问(修改)
        private _name: string;
        private _age: number;

        constructor(name: string, age: number) 
            this._name = name;
            this._age = age;
        

        // getter方法用来读取属性
        // setter方法用来设置属性
        // 它们被称为属性的存取器

        // 定义方法,用来获取name属性
        getName() 
            return this._name;
        

        // 定义方法,用来设置name属性
        setName(value: string) 
            this._name = value;
        

        getAge() 
            return this._age;
        

        setAge(value: number) 
            // 判断年龄是否合法
            if (value >= 0) 
                this._age = value;
            
        

        get name() 
            return this._name;
        

        set name(value) 
            this._name = value;
        

        get age() 
            return this._age;
        

        set age(value) 
            if (value >= 0) 
                this._age = value
            
        
    

    const per = new Person('半晨', 18);

    console.log('before-per:', per);
    // before-per: Person _name: "半晨", _age: 18
    per._name = '舒冬';
    per._age = -36;
    console.log('after-per:', per);
    // after-per: Person _name: "舒冬", _age: -36
    // 此时是可以编译通过
    // 但是_name和_age会出现下波浪线提示错误

    // 定义方法,获取name属性
    console.log('getName:', per.getName());
    // getName: 舒冬
    // 定义方法,设置name属性
    per.setName('苏檀');
    console.log('setName:', per.getName());
    // setName: 苏檀

    // 定义方法,获取age属性
    console.log('getAge:', per.getAge());
    // getAge: -36
    // 定义方法,设置age属性
    // 此处无法修改原先赋值为 -36 的值
    per.setAge(-16);
    console.log('setAge:', per.getAge());
    // setAge: -36

    // 使用自带的get和set方法
    console.log('before-getName:', per.name);
    // before-getName: 苏檀
    console.log('before-age:', per.age);
    // before-age: -36
    per.name = '宁毅';
    per.age = 36;
    console.log('after-getName:', per.name);
    // after-getName: 宁毅
    console.log('after-age:', per.age);
    // after-age: 36

    // ----------------------------------------------------------
    class A 
        // protected 受包含的属性,只能在当前类和当前类的子类中访问(修改)
        protected num: number;

        constructor(num: number) 
            this.num = num;
        
    

    class B extends A 
        test() 
            console.log(this.num);
            // 33
        
    

    const b = new B(3436);
    console.log('before-b:', b);
    // before-b: B num: 3436
    b.num = 33;
    // 属性“num”受保护,只能在类“A”及其子类中访问。
    console.log('after-b:', b);
    // after-b: B num: 33
    // 本来是不应该修改的,
    // 但是编译时没有限制报错不能生成文件导致结果是可以修改
    b.test();

    // ----------------------------------------------------------
    // 方式一和方式二是一样的效果
    // class C 
    //     name: string;
    //     age: number

    //     // 可以直接将属性定义在构造函数中
    //     constructor(name: string, age: number) 
    //         this.name = name;
    //         this.age = age;
    //     
    // 

    // 方式二和方式一是一样的效果
    class C 
        // 可以直接将属性定义在构造函数中
        constructor(public name: string, public age: number) 
            console.log(name, age);
            // xxx 111
        
    

    const c = new C('xxx', 111);
    console.log('c:', c);
    // c: C name: "xxx", age: 111
)();

以上是关于typescript封装属性publicprivateprotectedconstructorgetsetextends的主要内容,如果未能解决你的问题,请参考以下文章

typescript封装属性publicprivateprotectedconstructorgetsetextends

TypeScript,面向对象,类、构造函数、继承、抽象类、接口和封装

JavaScript面向对象轻松入门之封装(demo by ES5ES6TypeScript)

TypeScript

TypeScript

TypeScript