面向对象-构造函数和引用方法

对象

  • 对象:特指,类中的某个实例,由属性和方法构成。
  • JS中一切皆对象,也允许自定义对象。

1. 构造函数

1.1 构造函数

  • 字面量创建对象(回顾)
 <script>
    let obj = {
        name: '酷盖',
        age: 23,
        sex: '男',
        num: function () {
            let year = 2022
            console.log(year - obj.age)
        }
    }


    // 1.访问属性
    // console.log(obj.k)  此方法不能访问对象属性
    console.log(obj.name)
    console.log(obj['name'])

    // 2.访问方法
    obj.num()
    console.log(obj.num)

    // 3.遍历对象
    for (let key in obj) {
        //  key==='name'==='age'==='sex'==='num' 
        console.log(key) // 遍历属性名
        // obj[key]===obj['name']===obj['age']===obj['sex']===obj['num']
        console.log(obj[key])  // 遍历属性值
    }

    // 4.遍历数组对象
    let students = [
        { name: '酷盖', age: 23, gender: '男', hometown: '河南省' },
        { name: '奶盖', age: 29, gender: '男', hometown: '重庆市' },
        { name: '小摩托', age: 21, gender: '女', hometown: '四川省' },
    ]

    // 此时 key为数字类型,相当于i
    for (let key in students) {
        console.log(key) // key===0===1===2
        console.log(students[key])  // students[key]===students[0\1\2]
        console.log(students[key].name) // students[key].name=== students[0\1\2].name
    }
    
    //字面量定义属性和方法容易出现属性和方法重写问题
 </script>
  • 构造函数创建对象
<script>
    // 构造函数 : 内置构造函数 \ 自定义构造函数
    // 内置构造函数 :Object() 创建对象 
    // 实例化对象:使用 new 关键字调用函数
    let obj = new Object()
    obj.name = '赵盼儿'
    obj.age = 21
    console.log(obj)

    let obj1 = new Object({ name: '顾千帆', age: 23 })

    // 1.若构造函数不需要参数,()可省
    let obj2 = new Object

    // 2.自定义构造函数 函数名首字母大写
     function Person(uname, age, sex) {

        // 给Person设置属性和方法 this指向对象Person
        this.uname = uname
        this.age = age
        this.sex = sex
        this.borth = function () {
           console.log(`我今年${this.age}岁了`)
        }
    }
    // 实例化对象 
    // 构造函数创建的实例对象彼此独立互不影响    
    let Person1 = new Person('酷盖', 23, '男')
    console.log(Person1)
    Person1.borth()

    let Person2 = new Person('奶盖', 21, '女')
    console.log(Person2)
    Person2.borth()

	// 构造函数内部的 return 返回的值无效,默认返回一个对象。
</script>

1.2 instanceof 和 constructor

<script>
    // 1. instanceof : 用于检测实例对象对应的构造函数 (判断一个对象是否是另一个构造函数的实例对象 )   返回布尔值
    // 语法:对象 instanceof 构造函数名
    function Person(uname, age, sex) {
        this.uname = uname
        this.age = age
        this.sex = sex
        this.borth = function () {
            console.log(`我今年${this.age}岁了`)
        }
    }

    let Person1 = new Person('酷盖', 23, '男')
    console.log(Person1 instanceof Person)

    // 2. constructor : 指向构造函数本身
    console.log(Person1.constructor)
</script>

1.3 实例成员和静态成员

<script>
    // 构造函数创建的对象叫做实例对象,实例对象本身存在的属性和方法叫做实例成员
    // 1.实例成员 
    function Person(uname, age, sex) {
        // 以下属性和方法都是实例成员
        this.uname = uname
        this.age = age
        this.sex = sex
        this.borth = function () {
            console.log(`我今年${this.age}岁了`)
        }
    }
    // 实例化对象
    let obj = new Person('酷盖', 23, '男')

    // 2.静态成员 直接给构造函数添加的属性和方法叫静态成员(静态属性和静态方法)
    // 以下都叫静态成员
    Person.adress = '四川省'
    Person.id = 2019782016
    Person.nationalit = function () {
         console.log('english')
    }

    // 3. 实例成员只能由实例对象访问,静态成员只能由构造函数访问

    // 访问实例成员
    console.log(obj.uname)
    console.log(Person.uname)  //undefined

    // 访问静态成员
    console.log(Person.id)
    console.log(obj.id)    //undefined

    // 4.一般公共特征的属性或方法设置为静态成员

    // 5. 静态成员方法中的 this 指向构造函数本身
    Person.say = function () {
        // this指向Person
        console.log(`我的id是${this.id}`)
    }
    Person.say()
</script>

1.4 原型对象

<script>
    // 所有的 JavaScript 对象都会从一个 prototype(原型对象)中继承属性和方法(参看菜鸟教程中详解)
    function Person(uname, age, sex) {
        this.uname = uname
        this.age = age
        this.sex = sex
        this.borth = function () {
            console.log(`我今年${this.age}岁了`)
        }
    }
    // 实例化对象
    let obj = new Person('酷盖', 23, '男')

    // 使用prototype 属性可以给对象的构造函数添加新的属性和方法
    Person.prototype.adress = '四川省'
    Person.prototype.nationality = function () {
        console.log('english')
        }

    // 使用prototype添加的成员是实例成员,实例对象可访问
    console.log(obj.nationality)
    obj.nationality ()
    </script>

通常使用构造器(函数体)定义属性,使用原型对象(prototype)定义方法;如此,使得代码根据可读性。


2. 数据类型和方法

  • 简单数据类型:字符串、数字、布尔、undefined 和 null 。
  • 数据传递:变量传递给另一个变量,分为值传递引用传递
    – 值传递:传递的是数据。(简单类型)
    – 引用传递:传递的是地址。(引用类型)

2.1 引用类型

引用类型:对象、数组、正则、Date等。

2.1.1 Object

Object :内置构造函数,用于创建普通对象。任何一个对象都是Object 构造函数的实例化对象。

静态方法描述
Object.assign()创建新的对象
Object.keys()获取对象中所有属性名,返回数组
Object.values()获取对象中所有属性值,返回数组

静态方法只有构造函数能调用。

2.1.2 Array

Array:内置构造函数,用于创建数组。任何一个数组都是Array构造函数的实例化对象。

let arr = new Array(元素,元素,,,)
// 当只有一个参数时,表示长度
let arr = new Array(length)  
实例方法描述
.forEach()遍历数组
.filter()筛选所有满足条件的数组元素,并以数组形式返回
.map()每一个数组元素都将执行一遍回调函数,结果以数组形式返回
. join()拼接数组元素
.concat()合并数组
.sort()对数组元素排序
.splice()删除或替换原数组单元
.push()添加数组元素
.indexOf()检索数组中某个元素第一次出现的索引位置,找不到返回-1
.lastIndexOf()检索数组中某个元素最后一次出现的索引位置,找不到返回-1
.reverse()翻转数组
静态方法 .from()伪数组转成数组

了解更多

<script>
    // 1.concat() 合并数组
    let arr1 = [1, 2, 3, 4, 5]
    let arr2 = ['上', '山', '打', '老', '虎']
    let Arr = arr1.concat(arr2)
    console.log(Arr)

    // 2.join() 拼接数组单个元素成为字符串
    console.log(arr1.join('-'))
    console.log(arr1.join('|'))
    console.log(arr2.join(''))
    console.log(arr2.join(' '))

    // 3.reverse() 翻转数组
    console.log(arr1.reverse())

    // 4.indexOf 和lastIndexof
    let arr = [1, 2, 3, 5, 8, 5, 2, 7, 9, 5]
    // 返回元素第一次出现的位置
    console.log(arr.indexOf(5))
    // 返回元素最后一次出现的位置
    console.log(arr.lastIndexOf(5))
    // 查无此元素则返回-1
    console.log(arr.indexOf('wyb'))
    console.log(arr.lastIndexOf('yb'))

    // 5.sort() 给数组排序,不是大小排序,ASCALL编码排序,像比较字符串大小那样
    let arr3 = [123, 45, 66, 91, 27, 15, 26, 13, 4, 0]
    console.log(arr3.sort())
    // 正序排列 在方法里调用一个回调函数
    let re = arr3.sort(function (a, b) { return [a - b] })
    console.log(arr3)
    // 反序排列
    let ret = arr3.sort(function (a, b) { return [b - a] })
    console.log(arr3)

    // 6.静态方法 Array.isArray() 用于判断一个变量是否是数组 返回布尔值
    let m = 1
    console.log(Array.isArray(m))

    // 7. 静态方法 Array.from(伪数组) 将伪数组转换为真数组,但是伪数组中必须有length属性
    // 有的伪数组会返回length,无则添加

    // 8.forEach() 遍历数组
    let arr4 = [1, 2, 3, 4, 5]
    arr4.forEach(function (item, index, obj) {
        // 第一个参数 代表当前元素
        // 第二个参数 代表元素下标
        // 第三个元素 代表数组本身
        // 根据需要写参数的个数
        console.log(item, index, obj)
    })

    let arr5 = [
        { unaem: '一宝', age: 23, sex: '男' },
        { unaem: '奶盖', age: 23, sex: '男' },
        { unaem: '蓝忘机', age: 23, sex: '男' },
        { unaem: '美杜莎', age: 19, sex: '女' },
        { unaem: '酷盖', age: 23, sex: '男' }
    ]
    arr5.forEach(item => {
        console.log(`我叫${item.unaem},性别${item.sex},今年${item.age}岁了`)
    })

    // 9. find()和 findIndex()
    let arr6 = [1, 4, 7, 9, 2, 5, 8, 7, 9]
    // find() 查找满足的条件元素并返回 ,不满足则 undefined
    let re1 = arr6.find(function (item, index, obj) {
        return item > 7
    })
    console.log(re1)

    // arr.findIndex() 查找首次满足条件的元素,并返回索引号,不满足返回-1
    let re2 = arr6.findIndex(function (item, index, obj) {
        return item === 7
    })
    console.log(re2)

    // 10.some() 查找是否有元素满足条件,返回布尔值
    let re3 = arr6.some(function (item, index, obj) {
        return item === 7
    })
    console.log(re3)

    // 11.every() 检测是否所有元素都满足条件,返回布尔值
    let re4 = arr6.every(function (item, index, obj) {
        return item > 1
    })
    console.log(re4)

    // 12.filter() 筛选所有满足条件的元素,并以数组形式返回
    let re5 = arr6.filter(function (item, index, obj) {
        return item > 3
    })
    console.log(re5)

    // 13.map() 每一个元素都将执行一遍回调函数,结果以数组形式返回
    let re7 = arr6.map(function (item, index, obj) {
        return item * 2
    })
    console.log(re7)
</script>

2.1.3 RegExp

RegExp:内置的构造函数,用于创建正则表达式。任何一个正则都是RegExp 构造函数的实例化对象。

let re = new  RegExp(/123/)

2.2 包装类型

在 JS 中的字符串、数值、布尔类型数据是使用 Object 构造函数“包装”来的,被称为包装类型; 具有对象特征。

2.2.1 String

String :是内置的构造函数,用于创建字符串。

属性/实例方法描述
.length获取字符串的度长
.split()将字符串拆分成数组
.toUpperCase()将字母转换成大写
.toLowerCase()将字母转换成小写
.slice()用于字符串截取
.trim()去除字符串两端空格键
.indexOf()查找元素首次出现的索引值,找不到返回-1
.lastIndexOf()查找元素尾次出现的索引值,找不到返回-1
.startsWith()检测是否以某字符开头
.endsWith()检测是否以某字符结尾
.replace()用于替换字符串,支持正则匹配

了解更多

<script>
    // 字符串截取
    let str = 'welcometowonderland'

    // 1.slice()
    // slice(start) start代表索引号,当只有一个参数时,表示从这个索引号开始,一直截取到最后
    console.log(str.slice(3))
    // slice(start,end) 从start位置开始,截取到end位置,end位置上的值保留
    console.log(str.slice(3, 9))
    console.log(str.slice(9, 3)) // 截取不成功

    // 2.substring() 用法和slice一样,不同之处在于当有两个参数时能自动识别大小,并将较小的索引号赋给start
    console.log(str.substring(9, 3))

    // 3.substr(start,length) 表示从start位置其起往后截取lengh个字符
    console.log(str.substr(3, 4))
</script>

2.2.2 Number

Number :是内置的构造函数,用于创建数值。

let num = new Number(1)

// num.toFixed(number):用于保留number位有效数字
let num1 =3.1415926
console.log(num1.toFixed(2))

2.2.3 Boolean

Boolean : 是内置的构造函数,用于创建布尔值。

2.3 公共方法

方法描述
.valueOf()获取原始值
.toString()转换为字符串

undefined和null不能使用以上两个方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值