JS高级第一天

三元表达式

1.条件表达式?表达式1:表达式2
2.条件表达式用于判定:true||false
3.true执行表达式1
4.false:执行表达式2
5.本质就是简化if-else
6.if(条件表达式){
表达式1
}else{
表达式2
}
7.:
< type=“radio” name=“gender”> 男
< type=“radio” name=“gender”>女

<script>
    let inputs = document.querySelectorAll('input')

    inputs.forEach(function (input, i) {
        input.onclick = function () {

            // let res
            // if (i == 0) {
            //     res = '男'
            // } else {
            //     res = '女'
            // }

            let gender = i == 0 ? '男' : '女'

            console.log(gender)
        }
    })

冒泡排序

1.冒泡特点:遍历,相邻进行比较,位置不对就交换
for (let j = 0; j < ages.length; j++) {
for (let i = 0; i < ages.length - 1 - j; i++) {
// 第一个:ages[i] 第二个:ages[i+1]
if (ages[i] > ages[i + 1]) {
// 交换
let temp = ages[i]
ages[i] = ages[i + 1]
ages[i + 1] = temp
}
}
}

    console.log(ages)

    console.log(ages.sort(function (a, b) { return b - a }))

创建对象的几种形式

1.创建对象:字面量{}
let obj1 = {
name:“安其拉”
age:18
skill:技能
}
2.工厂模式:将结构写到函数里面,每次给函数提供数据,返回对象:结构是一样的,数据不同,可以实现结构的复用:
function createHer(name,age,skill){
return{
name:name
age:age
skill:skill
}
}
let obj2 = createGero(‘妲己’,18,’女‘,)
输出的结果为age:18,name:妲己,skill:女

构造函数

构造函数:方便区分对象,将对象进行分类:new object()

1.定义一个构造函数(为了区分:构造函数:大驼峰)
function CreateDog(name,gender,age,skill){
this.name=name
this.age=age
this.gender = gender
this.skill = skill
构造函数不需要返回值的
}
2.通过构造函数创建对象:new 构造函数()
let obj4 = new CreateDo(’'戈薇”,“女”,18,“破魔箭”)
输出结果为:age: 18
gender: “女”
name: “戈薇”
skill: “破魔剑”
使用构造函数的目的:就是为了区分对象

构造函数与普通函数的区别

1.普通函数可以用new?可以
function a() {
// 当构造函数的时候:普通的return无效
return ‘hello world’
}

    let obj1 = new a()
    console.log(obj1):结果为:a
    2.构造函数可以当普通函数用?可以
      // 2. 构造函数可以当普通函数用吗?可以
    function CreateStudent(name, age, stuno) {
        this.name = name
        this.age = age
        this.stuno = stuno
    }

    let obj2 = CreateStudent('张三', 18, '000001')
    console.log(obj2)
    构造函数可以有返回值:只有当返回值的结果是对象的时候
     function CreateTeacher(name, age) {
        this.name = name
        this.age = age

        // return 'gun'

        // 如果返回的是复杂数据类型:可以改变对象(没有任何含义)
        return { gun: '滚就滚' }
    }

    let obj3 = new CreateTeacher('小马哥', 50)
    console.log(obj3) 结果为:滚就滚

    // 构造函数:就是用来new的
    // 普通函数:就是用来调用的
    // 二者不需要也绝不可能交叉使用

构造函数给对象赋值的弊端

// 构造函数:让对象具有name,age属性,有一个方法:say,输出我是谁,今年多大

    function CreateStudent(name, age) {
        this.name = name
        this.age = age

        this.say = function () {
            console.log(`我是${this.name},我今年${this.age}岁`)
        }

        // 本质原因:给say赋值的函数是一个匿名函数:用后即焚(无法复用)
        // 解决方案:让函数变成有名函数,放到函数外面,然后让内部属性指向外部函数
    }

    let stu1 = new CreateStudent('王浩', 20)
    console.log(stu1)
    stu1.say()


    let stu2 = new CreateStudent('奥迪', 18)
    stu2.say()

    console.log(stu1.say == stu2.say)       // false:说明占用两份内存

    // 构造函数内部给this直接赋值函数:所有对象的内存中都会保留该函数
    // 占用的内存的数量就是对象的数量:内存占用比较严重

    // 解决内存占用问题
    function CreateTeacher(name, age) {
        this.name = name
        this.age = age

        this.say = say
    }

    // 定义一个有名函数:say
    function say() {
        console.log(`我是${this.name},我今年${this.age}岁`)
    }

    let t1 = new CreateTeacher('杰豪', 30)
    let t2 = new CreateTeacher('小马哥', 50)

    t1.say()
    t2.say()

    // 证明只有一份内存
    console.log(t1, t2)

    console.log(t1.say === t2.say)  // true


    // 上述解决方案有bug:say是一个全局函数
    // 容易被污染?

构造函数原型对象

1.解决内存占用问题

    // 解决内存占用问题
    function CreateTeacher(name, age) {
        this.name = name
        this.age = age
    }

    // 将为函数的属性:挂载到原型对象上
    CreateTeacher.prototype.say = function () {
        console.log(`我是${this.name},我今年${this.age}岁`)
    }

    let t1 = new CreateTeacher('杰豪', 30)
    let t2 = new CreateTeacher('小马哥', 50)

    t1.say()
    t2.say()

    console.log(t1, t2)

    // 证明:两个say不占用内存
    console.log(t1.say === t2.say)  // true

原型对象找函数原型 // 原型对象:只要是个函数,系统一定会为函数 自动 产生一个对象:原型对象prototype

    // 函数如何找到自己的原型对象呢?
    // 函数名.prorotype
    function a() { }

    console.log(a.prototype)
    // 原型对象中默认只有一个属性:constructor,指向所在的构造函数

    // 构造函数:男人
    // 男人找女人:男人.prototype
    // 原型对象:系统分配的女人
    // 女人找男人:constructor

    // 一对一关系:证明
    console.log(a.prototype.constructor == a)   // true


    // 原型对象是一个对象:对象是否可以添加属性?且非常安全
    // 男人.女人.新增属性 = 新的属性值
    // 构造函数.prototype.属性名 = 值
    a.prototype.say = function () {
        console.log('我是要成为海贼王的男人')
    }

    // 原型对象中的方法:给对象用,构造函数产生的对象
    let objA = new a()
    objA.say()

    // 对象的原型对象(__proto__) === 构造函数的原型对象(prototype)
    console.log(objA.__proto__ === a.prototype)     // true


    // 总结
    // 1. 是函数一定会有原型对象:系统产生
    // 2. 函数如何找到原型对象:函数名.prorotype
    // 3. 原型对象中默认有一个属性:constructor,指向构造函数本身

    // 4. 构造函数的作用:new产生对象,产生的对象与构造函数没有直接关联(间接有)
    // 5. 构造函数产生对象可以通过__proto__找到原型对象

    // 以上就是原型的三角关系

    // 解决的问题
    // 1. 原型对象只有1个:将方法存储到原型对象中,占用一份内存
    // 2. 原型对象是对象:方法存在对象里面不存在覆盖问题,与全局隔离:安全

总结:其实就是一级一级去找对象,顶级对象是null,第一个函数找其他就加prototyge就可以找到原型对象,往下面好找__proto__就找到new出来的新对象在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值