首页 > 其他分享 >【JS】面向对象-继承-私有和受保护的属性和方法

【JS】面向对象-继承-私有和受保护的属性和方法

时间:2022-10-29 12:11:29浏览次数:52  
标签:访问 私有 value JS 面向对象 Animal animalNumber size

在面向对象的编程中,属性和方法分为两组:
    内部接口 —— 可以通过该类的其他方法访问,但不能从外部访问的方法和属性。
    外部接口 —— 也可以从类的外部访问的方法和属性。

    在 JavaScript 中,有两种类型的对象字段(属性和方法):
    公共的:可从任何地方访问。它们构成了外部接口。
    私有的:只能从类的内部访问。这些用于内部接口。

    “受保护”的字段:只能从类的内部和基于其扩展的类的内部访问(例如私有的,但可以从继承的类进行访问),受保护的字段不是在语言级别的 Javascript 中实现的。

    1. 受保护字段的实现
    // class Animal {
    //     animalNumber = 100
    // }

    // let animal = new Animal()
    // console.log(animal.animalNumber); // 100
    // 此时属性animalNumber是公共的

    // 使用setter和getter将其设置为受保护的
    // 受保护的属性通常以下划线 _ 作为前缀
    class Animal {
        _animalNumber = 100
        set animalNumber(value){
            if(value < 0){
                value = 0
            }
            this._animalNumber = value
        }
        /*
                        也可写为:
                            setAnimalNumber(value){
                                if(value < 0){
                                    value = 0
                                }
                                this._animalNumber = value
                            }
                        这样可以接受多个参数
                    }
                    */
        get animalNumber(){
            return this._animalNumber
        }
    }

    let animal = new Animal()
    animal.animalNumber = -12
    console.log(animal.animalNumber); // 0
    // 此时animalNumber只能被设置为大于等于0的数

    // 若想让一个属性变为只读的,可以只设置getter不设置setter

    // 受保护的字段是可以被继承的
    class Dog extends Animal{
        test(){
            console.log(this._animalNumber); // 可以访问到父类受保护的__animalNumber属性
        }
    }
    let d = new Dog()
    d.test()

    2. 私有属性
    1.私有属性和方法应该以 # 开头,它们只在类的内部可被访问。
    class Animal {
        #size = 900
    }
    let a = new Animal()
    // console.log(a.#size); //Private field '#size' must be declared in an enclosing class 私有字段“#size”必须在封闭类中声明

    2. 私有字段与公共字段不会发生冲突。我们可以同时拥有私有的和公共的同名字段。

    3. 私有字段由语言本身强制执行,无法从外部或从继承的类中访问它,可以使用getter和setter进行访问。
    class Animal {
        #size = 900
        get size(){
            return this.#size
        }

        set size(value){
            this.#size = value
        }
    }
    let a = new Animal()
    console.log(a.size); // 900
    a.size = 800
    console.log(a.size); // 800

    4. 私有字段不能通过 this[name] 访问
    class Animal {
        #size = 900
        get size(){
            return this['#size']
        }

        set size(value){
            this.#size = value
        }
    }
    let a = new Animal()
    console.log(a.size); // undefined
    a.size = 800
    console.log(a.size); // undefined

  受保护的属性和方法:只能从类和扩展类的内部访问,通常以_开头(自定义)。

  私有的属性和方法:只能在类自己内部访问,以#开头,可以通过getter和setter在外部进行访问。

标签:访问,私有,value,JS,面向对象,Animal,animalNumber,size
From: https://www.cnblogs.com/ahoge/p/16838445.html

相关文章

  • js一
    浏览器API文档对象模型API:DOM(DocumentObjectModel)API,能通过创建,修改,移除HTML,为页面动态应用新样式等手段来操作HTML和CSS;地理位置API(GeolocationAPI)获取地理信息......
  • 【POI2011】Lightning Conductor_【JSOI2016】灯塔(决策单调性优化dp)
    首先进行变形:\[\begin{aligned}a_j&\leqa_i+p-\sqrt{|i-j|}\\p&\geq\max_{j=1}^n\left(a_j+\sqrt{|i-j|}\right)-a_i\end{aligned}\]把\(|i-j|\)拆为\(\max(i-j......
  • 如何通过node.js(express)写接口
    准备工作:在开始项目之前确保自己的计算机已经安装了 Node.js【node.js下载地址:https://nodejs.org/en/】一、创建项目打开文件夹,在想要的位置为项目新建一个目录文件,c......
  • 【JS】静态属性和方法
    静态方法和属性:      1.静态方法:        将一个方法作为整体赋值给类,该方法作为类的方法使用,而不是某个实例的方法使用,使用static关键字修......
  • (文件操作)读入"price2016.json"文件中数据,然后将转换为二维数据在于data列表中,最后显示
    样例输出[['同比','城市','定基','环比'],['120.7','北京','121.4','101.5'],['127.3','上海','127.8','101.2'],['119.4','广州......
  • 前端利用jsencrypt.js进行RSA加密、解密
    RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制 。在公开密钥密码体制中,加密密钥(即公开密钥)PK是......
  • 从0快速部署云托管服务:node.js
    欢迎使用微信云托管,本文将带领你通过微信云托管创建一个服务,并在小程序和WEB端调用此服务(以Node.JS为例),本系列会继续更新Java、PHP、Golang等其他语言的部署教程(当然......
  • JS中搜索数组的四种方法
    前端经常要通过javaScript来处理数组中的数据,其中就包括检查数组中是否包含满足特定搜索条件的单个或者多个值,这就需要我们关于用于确认的布尔值、数组中值得位置索引或包含......
  • js promise概念
    Promise构造函数接受一个函数作为参数。该函数的两个参数分别是resolve和reject,它们是两个函数,由JavaScript引擎提供,不用自己部署。//代码resolve函数的作用:将Promi......
  • Node.js
    Node.js是一个基于ChromeV8引擎的JavaScript运行环境。一、初识Node.js环境的安装安装途径:官网:https://nodejs.org/en/LTS版本是长期稳定版,建议安装源码下......