javascript 类定义常见注意事项

javascript 类定义常见注意事项

1、类中不可以用function定义方法

2、类中的构造函数可以定义,也可以不定义,不定义的情况下系统会自动补充一个默认的constructor(){} 构造函数

3、类的静态变量,必须用类名才可以访问到,类申请出来的变量,是访问不到该静态变量的,只会动态为对象 新增一个非静态变量。

4、类中的变量可以显示申明,但是不能使用 let、const、var关键字。也可以不申明,用到的时候用this.xxx,进行动态创建。

5、可以使用属性构造器,用定义方法的方式,定义属性。优势是可以为属性的访问时,增加自定义逻辑触发。

6、由于不能用const方法,申请变量,如果要定义只读属性,可以使用get 构造器定义一个返回常数的方式( return "常数" ),变相定义一个只读属性。

7、使用 Object.freeze 修饰对象,可以让对象类的属性变得不可更改。

javascript 复制代码
    class Person{
        userName; //在类中,不可以用let、const、var等申明属性
        //expectJob   属性也可以不申明,直接使用,也是正确的使用方法。
        static nickName;//  注意这里是静态类,只有使用类名Person.nickName,才能访问到他,用对象.nickName,是访问不到它的,只会新创建一个非静态的nickName。
        constructor(name,job='coding'){  //构造函数也可以不定义,系统会自动补充一个默认的constructor(){}
            this.userName=name;
            this.expectJob=job;//属性也可以不申明,直接使用
        }
        getName(){
            return this.userName;
        }

        getExpectJob(){
            return this.expectJob;
        }

        getNickName(){
            return this.nickName;
        }

        setNickName(value){
            return this.nickName=value;
        }

        getStaticNickName(){
            return Person.nickName;
        }

        setStaticNickName(value){
            return Person.nickName=value;
        }

        //只读属性构造器,访问的时候只需要用Person.PI ,如果用该类申请的对象person.PI是访问不到该属性的。
        // 这里还有个属性构造器的概念。 属性构造器只需要用get xx(),set xx(value),就可以定义出属性,静态非静态都可以定义。
        static get PI() {  //
            return 3.14159265359;
        }

        //用Object.freeze 冻结对象,使得对象属性/变量 不可以修改
        static get DEFAULT_CONFIG() {
            return Object.freeze({
                theme: 'dark',
                language: 'zh-CN',
                version: '1.0.0'
            });
        }
    }

    //这里没有传递函数,相当于new Person(undefined,undefined),
    // 由于job有默认值coding,最终expectJob被初始化为coding
    const  person=new Person();
    person.setNickName('Alice');
    person.setStaticNickName('Static Alice');
    console.log(`person.getName() = ${ person.getName() }`); // undefined
    console.log(`person.getExpectJob() = ${ person.getExpectJob() }`); // coding
    console.log(`person.expectJob = ${ person.expectJob }`); // undefined
    console.log(`person.getNickName() = ${ person.getNickName() }`); // Alice
    console.log(`person.getStaticNickName() = ${ person.getStaticNickName() }`); //Static Alice
    console.log(`Person.nickName = ${ Person.nickName }`);// Static Alice
    console.log(`person.nickName = ${ person.nickName }`);// Alice
    console.log(`Person.PI = ${ Person.PI }`); // 3.14159265359
    console.log(`Person.PI = ${ person.PI }`); // undefined

    Person.DEFAULT_CONFIG.theme = 'light';  // 静默失败(被冻结) ,只能用Person类访问
    console.log(`Person.DEFAULT_CONFIG.theme = ${ Person.DEFAULT_CONFIG.theme }`); //dark

浏览器console输出内容:

相关推荐
程序员黑豆2 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
To_OC3 小时前
踩了个 TS 的坑之后,我终于把 type 和 interface 掰明白了
前端·react.js·typescript
GreenTea3 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
浮生望3 小时前
前端API工程化:用 Mock 数据与 Axios 配置实现独立于后端的并行开发
前端
2603_965148114 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
万少4 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
波波0074 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
Brown.alexis5 小时前
es6知识点1-自备使用
前端·ecmascript·es6
小爬的老粉丝6 小时前
JavaScript 纯前端预览 WPS:先识别容器,再路由解析器
前端·javascript·wps
知无不研6 小时前
lambda表达式的使用(3)
开发语言·c++·lambda