27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]
E-mail:mzze@163.com
Q Q:32362389
W X:xiaomi168527
27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]
大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]
E-mail:97157726@qq.com
Q Q:97157726
//对象要申请内存的,存在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))
本站内容均为小米原创,转载请注明出处:小米技术社区>> 6第四阶段14 对象方法-this的使用,链式编程,构造函数,可选链,symbol类型,原始数据转换