Class类的基本使用

系列文章目录

第一章:Class类的基本使用

第二章:Class类的属性与方法

第三章:继承

第四章:注意事项和应用

前言

前面我们学习了用构造函数模拟类,现在我们有了类语法,所以不再使用构造函数来模拟类

一、Class类的基本使用

 //使用class声明一个类
        class Person{
            //每个类都有构造方法constructor,实例化对象时执行构造方法
            //即使你不写构造方法,浏览器也会自动补全,但没有可执行的内容。
            constructor(name,age){
                //这里的this类似于构造函数中返回的实例对象。
                //一般在构造方法中定义属性,不定义方法
                this.name = name;
                this.age = age;
            }
            //这里定义方法等同于在构造函数的原型上定义方法,是实例的共同方法
            speak(){
                console.log('speak');
            }
        }
        //实例化一个Person对象:
        const p1 = new Person('小明',18);
        const p2 = new Person('小猪',19);
        const v = `${p1.name},${p1.age},${p2.name},${p2.age}`;
        console.log(v)//小明,18,小猪,19
        console.log(p1.speak == p2.speak); //true

二、类的两种定义方式 

 //类的两种定义方式
        //一、声明形式
        class Person1{
            constructor(){}
            speak(){}
        }
        //二、表达式形式
        const Person2 = class{
            constructor(){}
            speak(){}
        }

三、立即执行的类

 //立即执行的类:与立即执行函数类似,但是有用new调用
        new (class{
            constructor(){
                console.log('constructor')
            }
        })()

四、属性和方法

1、实例的属性和方法

把属性写在构造方法的外面,则每个实例都会有默认的自己的这个属性。

把方法写在构造方法的外面,则这个方法存在于类构造函数的原型上

示例:

 class Person1{
            age = 0;
            sex = 'male';
            constructor(){}
            speak(){
                return "我是speak"
            }
        }
        const per1 = new Person1();
        const per2 = new Person1();
        console.log(per1.age,per1.hasOwnProperty("age"));//0 true
        console.log(per2.speak(),per2.hasOwnProperty("speak"),Person1.prototype.hasOwnProperty("speak"));//我是speak false true

2.静态属性和方法(类的属性和方法)

const Person2 = class{
            constructor(){}
            //声明静态方法:在方法名前加static
            static speak(){
                console.log('我是静态的');
                console.log(this); //this指向class
            }
            //声明静态属性:
            // static version = '1.0'; 不推荐这种写法,目前只是提案,有兼容性问题
            static getVersion(){
                return '1.0';
            }
        }
        //调用静态方法:由类调用
        Person2.speak()
        //获取静态属性
       console.log( Person2.getVersion());//1.0

五、私有属性和方法

1.什么是私有属性:

私有属性只能在类的内部访问和修改。

2.为什么需要私有属性和方法:

一般情况下,类的属性和方法都是公开的,公有的属性和方法可以被外界修改,造成意想不到的错误。

3.模拟私有属性和方法:

js中还没有私有属性的语法,但是我们可以模拟私有属性和方法,达到我们想要的效果。

1.下划线开头表示私有的

下划线开头表示私有是整个行业共同约定的。但是这个方法不具备很强的约束力。

 class Person{
            constructor(name){
                this._name = name;
            }
            speak(){
                console.log('speak');
            }
            getName(){
                return this._name;
            }
        }
        const p = new Person("xiaohong")
        console.log(p.getName());

2.将私有属性和方法移出类

//实际开发中我们会在一个模块中声明类,这里用IIFE模拟一个模块。
        (function(){
            //在当前作用域中声明变量name,而不是在类中声明name属性
            let name = "";
            class Person{
                constructor(username){
                    //name是类的属性不是实例的属性
           // console.log(Person.hasOwnProperty("name")) true
                    name = username;
                  
                }
                speak(){
                    console.log('speak');
                }
                getName(){
                    return name;
                }
            }
            //暴露Person
            window.Person = Person;
        })();
        //实际开发中的代码也不会写在全局作用域中,也会写在一个模块中,这里我们也用IIFE模仿一个模块
        (function(){
            const p = new Person('Alex');
            console.log(p.getName()); //Alex
           // console.log(p.hasOwnProperty("name")) false
        })();

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值