【ES】笔记-Class类剖析

这篇具有很好参考价值的文章主要介绍了【ES】笔记-Class类剖析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ES6提供了更接近传统语言的写法,引入Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,ES6的class可以看作只是亿个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
知识点:

  1. class 声明类
    2.constructor 定义构造函数初始化
    3.extends 继承父类
    4.super 调用父级构造方法
    5.static 定义静态方法和属性
    6.父类方法可以重写

Class介绍与初体验

ES5 通过构造函数实例化对象

    <script>
        //1.ES5 通过构造函数实例化对象
        //手机
        function Phone(brand,price){
            this.brand=brand;
            this.price=price;
        }
        //通过原型对象添加方法
        Phone.prototype.call=function(){
            console.log("我可以打电话!!");
        }

        //实例化对象
        let Huawei=new Phone('华为',5999);
        Huawei.call();
        console.log(Huawei);
    </script>

【ES】笔记-Class类剖析,# ECMAScript,elasticsearch,笔记,javascript

ES6 通过Class中的constructor实列化对象

    <script>
        //2.class
        class Shouji{
            //构造方法 名字不能被修改
            //实例化时会自动执行
            constructor(brand,price){
                this.brand=brand;
                this.price=price;
            }

            //方法必须使用该语法,不能使用ES5的对象完整形式
            call(){
                console.log("我可以打电话!!");
            }
        }

        let onePlus=new Shouji("1+",1999);
        console.log(onePlus);
    </script>

【ES】笔记-Class类剖析,# ECMAScript,elasticsearch,笔记,javascript
注意事项:

  • Class必须通过constructor定义属性
  • 方法直接写就行,在class里面创建方法也不需要写function关键字,也不需要用this

Class 静态成员

实例对象与函数对象的属性不相通

        function Phone(){

        }
        Phone.name='手机';
        Phone.change=function(){
            console.log("我可以改变世界");
        }
        let nokia=new Phone();
        console.log(nokia.name);//打印undefined
        nokia.change(); //打印Uncaught TypeError: nokia.change is not a function
 

实例对象与函数对象原型上的属性是相通的

        function Phone(){

        }
        //构造函数本身也是对象
        //函数对象的属性,只属于函数对象,这样的属性称之为静态成员
        Phone.name='手机';
        Phone.change=function(){
            console.log("我可以改变世界");
        }
        Phone.prototype.size='5.5inch';
        let nokia=new Phone();
        console.log(nokia.size);//打印5.5inch

Class中对于static 标注的对象和方法不属于实列对象,属于类。

        class Phone{
            static name='手机';
            static change(){
                console.log("我可以改变世界");
            }
        }

        let nokia =new Phone();
        console.log(nokia.name); //打印:undefind
        console.log(Phone.name);//打印:手机

以class方法展示,因为ES6明确规定,Class内部只有静态方法,没有静态属性,而要想得到设置静态属性,需要在实例属性前面加上 static 关键字;静态方法也要加上 static 关键字,表示该方法不会被实例继承,而是直接通过类来调用。

ES5构造函数继承

        //手机
        function Phone(brand,price){
            this.brand=brand;
            this.price=price;
        }

        Phone.prototype.call=function(){
            console.log("我可以打电话");
        }

        //智能手机
        function SmartPhone(brand,price,color,size){
            Phone.call(this,brand,price);
            this.color=color;
            this.size=size;
        }

        //设置子级构造函数的原型
        SmartPhone.prototype=new Phone;
        SmartPhone.prototype.constructor=SmartPhone;

        //声明子类的方法
        SmartPhone.prototype.photo=function(){
            console.log("我可以拍照");
        }
        SmartPhone.prototype.playGame=function(){
            console.log("我可以玩游戏");
        }

        const chuizi=new SmartPhone('',2499,'黑色','5.5inch');
        console.log(chuizi);

【ES】笔记-Class类剖析,# ECMAScript,elasticsearch,笔记,javascript

Class的类继承

extends 关键字

贴合传统语言面向对象的写法

        /*
            代码简洁,非常贴合传统语言面向对象的写法
        */
        class Phone{
            //构造方法
            constructor(band,price){
                this.band=barnd;
                this.price=price;
            }
            //父类的成员属性
            call(){
                console.log("我可以打电话!!");
            }
        }

        class SmartPhone extends Phone{
            //构造方法
            constructor(band,price,color,size){
                super(band);//父类的构造方法
                this.color=color;
                this.size=size;
            }
            photo(){
                console.log("拍照");
            }
            playGame(){
                console.log("玩游戏");
            }
        }

        const xiaomi=new SmartPhone('小米',799,'黑色','4.7inch');
        console.log(xiaomi);
        xiaomi.call();
        xiaomi.photo();
        xiaomi.playGame();

【ES】笔记-Class类剖析,# ECMAScript,elasticsearch,笔记,javascript
class可以通过 extends 关键字实现继承,让子类继承父类属性和方法,可以看出 extends 的写法比上文 原型链继承 清晰方便的多。

super 关键字

上面代码用到 super 这个关键字,这里简单说明一下:子类继承父类的 constructor() 构造函数中必须要有 super(),代表调用父类的构造函数,没有就会报错,super虽然代表父类的构造函数,但是返回的是子类的实例,即super内部的this指的是子类的实例。作为函数时,super() 只能用在子类的构造函数中,用在其他地方就会报错

判断继承是否存在

Object.getPrototypeOf()方法可以用来从子类上获取父类,所以可以用来判断一个类是否继承另一个类。

<script>
    class people {}
    class boy extends people {}
    console.log(Object.getPrototypeOf(boy) === people);//true
</script>

私有属性和方法继承

私有属性和方法只能定义在它本身的class里面使用,所以子类会继承父类所有的属性和方法除了私有属性和方法,那么如何让子类访问到父类中的私有属性和方法呢?如果父类定义了私有属性的读写方法,子类就可以通过这些方法,读取私有属性。

<script>
    class people {
        #name = '张三'
        // 定义用来读取私有属性和方法的函数
        getName(){
            return this.#name
        }
    }
    class boy extends people {
        constructor(){
            // 调用父类的构造函数
            super()
            console.log(this.getName());//张三
        }
    }
    let b = new boy()
</script>

子类对父类方法的重写

类似于Java,C#,C++面向对象语言,子类也可以对父类方法的重写。区别的时候面向对象通常使用overwrite关键字标记这个重写的方法。而ES6中则直接标记与父类的同名方法。

        class SmartPhone extends Phone{
            //构造方法
            constructor(band,price,color,size){
                super(band);//父类的构造方法
              ...
            }
            ....
            call(){
                console.log('我可以进行视频通话');
            }
        }

注意:普通的成员方法中是不可以调用super()

Class中的getter和setter设置

在ES6中,类的内部可以使用 getter (取值函数) 和 setter (存值函数) 关键字,即 get 和 set ,对某个属性设置取值函数和存值函数,拦截该函数的存取行为。

        //get 和set 对对象属性方法的绑定
        class Phone{
            get price(){
                console.log("价格属性被读取了");
                return 'iloveyou' //get 有返回值
            }
            set price(newVal){
                console.log("价格属性被修改了");
            }
        }
        
        //实列化对象
        let s=new Phone();
        console.log(s.price);

        s.price='free';

【ES】笔记-Class类剖析,# ECMAScript,elasticsearch,笔记,javascript

class显示原型与隐式原型关系

每个对象都有隐式原型 proto 属性,指向对应的构造函数的显示原型 prototype 属性,class作为构造函数的语法糖,同时也具有 prototype 属性和 proto 属性,所以存在两条继承链。当然这里这做一个了解。文章来源地址https://www.toymoban.com/news/detail-700654.html

<script>
    class people {}
    class boy extends people{}
    
    // 子类的__proto__属性,表示构造函数的继承,总是指向父类。
    console.log(boy.__proto__ === people); // true
 
    // 子类prototype属性的__proto__属性,表示方法的继承,总是指向父类的prototype属性。
    console.log(boy.prototype.__proto__ === people.prototype); // true
</script>

到了这里,关于【ES】笔记-Class类剖析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ECMAScript (ES)简介

    ECMAScript (ES) 是一种标准化的脚本语言规范,它是 JavaScript 语言的基础 基本语法结构: 变量声明 : 使用 var (ES5 及以前版本)、 let (ES6 起引入)或 const (ES6 起引入)声明变量。 数据类型 : 基本数据类型: number 、 string 、 boolean 、 null 、 undefined 、 symbol (ES6 新增

    2024年04月11日
    浏览(40)
  • 3分钟搞懂:JavaScript 和 ECMAScript

    ECMAScript 是 JavaScript 语言的 国际标准 ,JavaScript 是 ECMAScript 的 一种实现 (Adobe ActionScript 和 JScript 同样实现了 ECMAScript)。 ECMAScript 是欧洲计算机制造商协会 ECMA(European Computer Manufacturers Association)发布的浏览器脚本语言标准。它是 262 号标准文件,又叫 ECMA-262。 ECMAScript 定义

    2023年04月22日
    浏览(47)
  • ECMAScript版本对比:从ES1到ES2021

    ECMAScript(简称ES)是一种用于编写Web前端JavaScript的标准化语言。自1997年发布第一版(ES1)以来,ECMAScript已经经历了多个版本的更新和演进。每个版本都引入了新的语法和功能,为开发人员提供了更强大和灵活的工具。 本文将对ECMAScript的各个版本进行对比,详细介绍每个版

    2024年02月12日
    浏览(30)
  • 深入理解 ECMAScript modules:提升你的 JavaScript 技能(六)

    🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_ CSDN 博客专家、23年度博客之星前端领域TOP1 🕠 牛客 高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课 签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你

    2024年02月21日
    浏览(52)
  • 深入理解 ECMAScript modules:提升你的 JavaScript 技能(一)

    🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_ CSDN 博客专家、23年度博客之星前端领域TOP1 🕠 牛客 高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课 签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你

    2024年02月20日
    浏览(44)
  • JavaScript Es6_3笔记

    了解构造函数原型对象的语法特征,掌握 JavaScript 中面向对象编程的实现方式,基于面向对象编程思想实现 DOM 操作的封装。 了解面向对象编程的一般特征 掌握基于构造函数原型对象的逻辑封装 掌握基于原型对象实现的继承 理解什么原型链及其作用 能够处理程序异常提升程

    2024年02月11日
    浏览(51)
  • JavaScript学习笔记01(包含ES6语法)

    Js 最初被创建的目的是“使网页更生动”。 Js 写出来的程序被称为 脚本 ,Js 是一门脚本语言。 被直接写在网页的 HTML 中,在页面加载的时候自动执行 脚本被以纯文本的形式提供和执行,不需要特殊的准备或编译即可运行(JIN compiler) Js 不仅可以在浏览器中执行,也可以在

    2024年02月16日
    浏览(54)
  • BCSP-玄子前端开发之JavaScript+jQuery入门CH07_ECMAScript 6基础

    4.7.1 ECMAScript 6 简介 ECMAScript 6.0(简称 ES6) 是JavaScript语言的下一代标准 正式发布于2015年6月 目标 使JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言 版本升级 ECMAScript 2015 ECMAScript 2016 ECMAScript 2017 ECMAScript和JavaScript 的关系 前者是后者的规格,后者是前者的

    2023年04月27日
    浏览(54)
  • ES(elasticSearch学习笔记)

    es是面向文档型的数据库,一条数据在es数据库就是一个文档,和关系型数据库做一个类比: 1:es的索引类比关系型数据库的数据库, 2:es的type类比数据表( 7.0版本以上删除了type这个概念 ), 3:es的索引下的文档document类比关系型数据库的行,新增时可以指定文档主键id

    2023年04月08日
    浏览(44)
  • ES6(ECMAScript 2015)有哪些新属性,如何判断当前浏览器是否支持?

    ES6(ECMAScript 2015)引入了许多新的语法和特性,以增强 JavaScript 编程语言的功能。以下是一些常见的 ES6 语法和特性以及它们的解释: let 和 const 声明 : let 和 const 用于声明变量,代替了旧的 var 。 let 声明的变量具有块级作用域,而 const 声明的变量是不可变的(常量

    2024年02月07日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包