小米技术社区
小米技术社区管理员 关于小米

27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]

E-mail:mzze@163.com

Q Q:32362389

W X:xiaomi168527

小米技术社区大牛王飞 关于王飞

27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]

E-mail:wf_live@126.com

Q Q:3940019

微博:王小贱ss

小米技术社区设计小艳 关于小艳

大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]

E-mail:97157726@qq.com

Q Q:97157726

标签云
精品推荐
  • 什么是闭包?js闭包的2个最大用途以及注意事项

    什么是闭包?js闭包的2个最大用途以及注意事项

    各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。简单的说,闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因……
    199人已经看过了
您的位置:首页 > 前端开发 > Javascript > 原生JS

6第四阶段14 对象方法-this的使用,链式编程,构造函数,可选链,symbol类型,原始数据转换

分类: 原生JS90个赞


//对象要申请内存的,存在js中叫做堆的地方,栈是堆的上面
//1.对象方法   对象可以存任何东西,有些东西有动作(变量),比如人会叫会喊,
let user = {
    name:"admin",
    age:"30",
/*     sayHi2:function (){
        console.log("nihao")
    }  之前的写法*/
    sayHi2(){
        console.log(`大家好,我是${user.name}`)   //把${user.name}变为${this.name}
    } //简写方法
}
user.sayHi= function (){
    console.log("hello")
}
user.sayHi()
user.run=run
function run(){
    console.log("run...")
}
user.run()
user.sayHi2()  //结果 大家好,我是admin
let user1 = user; //复制一个user1
user = null; //清空user1
// user1.sayHi2()  //结果报错 如果清空原始,复制的会报错,说name为空  
//2.this的使用 另一种写法
let user3 = {
    name:"admin",
    age:"30",
    sayHi3(){
        console.log(this);  //这里的this是global 全局
        console.log(`大家好,我是${this.name}`)   //这里把把${user.name}变为${this.name}
    } 
}
user3.sayHi3()  //js的this 在方法调用的时候才去判断this是谁,其他高级语言不是,一开始就定义好了
let func = user3.sayHi3  //因为this是全局变量,所以这种写法其实是global.func=user3.sayHi3
func(); //结果为我是undefined,原因很简单 这种写法相当于global.func.name=而原本是global.sayHi3.name  this的用法要注意

//在node.js中,global是全局对象,全局环境下的this是空对象,在浏览器中,全局对象是window,

function makeUser (){
    return {
        name:"Adam",
        ref:this
    }
}
let user4=makeUser();
console.log(user4.ref.name)  //因为user4是全局变量,全局没有name属性,所有结果是 undefined   

//换成以下方式就可以调用name

function makeUser1 (){
    return {
        name:"Adam",
        ref:function(){
            return  this;
        }
    }
}
let user5=makeUser1();
console.log(user5.ref().name) //结果是Adam,因为user4调用的是方法,他的方法上下级this就是makeUser1(),所以可以调用出来

//3.链式编程  非常爽

let ladder ={
    setp :0,
    up(){
        this.setp++;  //一定要带分号;
        return this;
    },
    down(){
        this.setp--;
        return this;
    },
    zhanshi(){
        console.log(this.setp);
        return this;
    }
    
}

ladder.up()
ladder.up()
ladder.down()
ladder.zhanshi() //结果为1,因为先加了2次,在减了一次
ladder.up().down().up().zhanshi() //也可以这么调用,必须写return this

//4.构造函数 与new 操作符  比较重要
//构造函数注意事项
//1.构造函数的命名 强制首字母大写
//2.只能由new操作符来完成执行,不用new会得到一个错误的结果
//3.函数里面的属性不是随意些,如果想定义一个属性,要用this
//4.new关键词会导致构造函数产生几个隐含操作1.this等于空对象2.如果我们加入return返回值,值类型不起作用,加入对象会被替代3.new在申请内存
function Person(name,age){
    this.name = name;
    this.age =age;
}
let user6 = new Person("admin",18) //如果为空参()可以省略
console.log(user6.age);
console.log(user6.name)

function Person1(name,age){
    if(!new.target){
        return new Person1(name,age) //如果new没有值则返回
    }
    this.name = name;
    this.age = age;
}
let user7 = new Person1("hello",17);
console.log(user7.age);
console.log(user7.name)

//5.可选链 ?.  不能写入,只能读取
let user8={

};
//出错就意味程序停了,JS执行的是V8引擎,是单线程,如果是undefined 还可以判断
//老早之前需要先判断address有没有 street有没有,要不然程序就停了
// let street = user && user.address && user.address.street;
console.log(user8.address) //undefined
//console.log(user8.address.street) //报错undefined底下的东西直接报错 
//用可选链可以解决这个问题
console.log(user?.address?.street)  //结果是undefined  如果是第一个是undefined立刻停止,不管第二个是什么值,防止报错

//user8?.name="123"; //可选链不能写入,只能读取

//6.symbol类型 在js对象中,key只能是字符串或者symbol类型
//字符串类型有个缺点,容易重复
let id = Symbol("id");
let id2 = Symbol("id");
console.log(id==id2) //结果是false,Symbol是唯一的

//symblo小项目  symblo.for symblo是唯一的,不会受影响
let user9 = {
    name:"admin"
}
let id3 =Symbol("id")
user9[id3] = 10;
console.log(user9[id3])
// let keys = Object.keys(user);
// console.log(keys)

//7.原始数据类型转换
let user10 = {
    name:"Admin",
    money:1000
}
let user11={
    name:"John",
    money:300
}
//现在判断是user10的钱多还是user11的钱多
//可以指定一个属性,来做这个运算
let user12 = {
    name:"Admin",
    money:1000,
    [Symbol.toPrimitive](hint){
        //里面会有3中类型的值 "sting" "number" "default"
        console.log("type",hint)
        return hint ==="string" ? this.name : this.money;
    }
}
let user13={
    name:"John",
    money:300,
    [Symbol.toPrimitive](hint){
        //里面会有3中类型的值 "sting" "number" "default"
        console.log("type",hint)
        return hint ==="string" ? this.name : this.money;
    }  
}
console.log(user12>user13)
console.log(String(user))


小米技术社区