javascript对象复习
分类:javascript
对象
对象是什么
对象,什么是对象,你有对象吗,正经程序员谁有对象?,你是正经程序员吗。
在我个人的理解里,其实对象是对函数和数据的分类,把有关系的数据和函数装起来就是对象,这样就可以方便我们管理代码。
而官方的定义是具体的一个事物就是对象,所以有了那句编程界的名言,万物皆对象,所以不要说程序员没用对象,一切都是程序员的对象
let No={
name: '不忘', //对象内的这些都叫属性
faceValue:'帅出天际',
haveGirl(){ //对象内的函数叫方法
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
}
}
//一个No对象
属性的基本操作
属性的增查改删
let No={
name: '不忘',
faceValue:'很高',
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
}
}
No.study="热爱"//增加
console.log(No.study);//查询
console.log(No['study']);//查询
No.faceValue='帅出天际';//修改
delete No.study;//删除
取值和取址
对象是引用类型,所以对象所存的数据的方式你可以当作放到一个地方,而变量名存放的是那个地方的地址
let first={ num:'32'} //first内放的是一个地址, 地址指向存放数据num的位置
let second= first //将first的地址复制到second中
console.log(first);
console.log(second);
second.num=64 //将second中的num修改
console.log(first); //因为first和second的地址指向同一个位置,所以first的num也发生修改
console.log(second);
对象的扩展运算
对象的扩展和数组一样的,不过是把对象展开
let No={
name: '不忘',
faceValue:'很高',
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
}
}
let Nof={
...No, //展开
study:'热爱'
}
console.log(Nof);
对象的解构赋值
-
解构的基础用法
let No={ name: '不忘', faceValue:'很高', haveGirl(){ console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue); } } let {name, faceValue}=No console.log(name);
-
对象赋值的简写
let name='不忘' let faceValue='很高' let No={name,faceValue} console.log(No);
-
多层解构
let No={ name: '不忘', faceValue:'很高', girlfriend:{ first:'冰冰' }, haveGirl(){ console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue); } } let {girlfriend:{first}}=No//只解构一部分是没有问题的 console.log(first);
-
解构默认值
let No={name:'不忘',faceValue:'很高'} let {name,faceValue,girlfriend='冰冰'}=No console.log(girlfriend); //多用于默认参数
-
参数解构
function look(name,{age,faceValue}) { console.log(name,age,faceValue); } look('不忘',{age:'18',faceValue:'很高'})
对象和原型链上的属性检测
let No= {name:'张三'};
let Nof={father:'张三爸爸'}
Object.setPrototypeOf(No,Nof)//将Nof设置为No的父级
console.log(No);
console.log(No.hasOwnProperty('father'));//检测不到原型链上的属性
console.log('father' in No);//都可以检测
计算属性
let a=1
let No={}
No[`a-${a}`]=a
console.log(No);
assign方法
let a={name:'不忘'}
let No={girlfriend:'冰冰'}
No=Object.assign(No,a)//合并两个对象
console.log(No);
对象遍历
let No={
name: '不忘',
faceValue:'很高',
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
}
}
console.log(Object.keys(No));//第一种,遍历属性名
console.log(Object.values(No));//第二种,遍历属性值
console.log(Object.entries(No));//第三种,遍历属性名和属性值
for(const key in No){
console.log(No[key]);
}
for (const iterator of Object.keys(No)) {
console.log(iterator);
}
for (const iterator of Object.values(No)) {
console.log(iterator);
}
for (const [key,value] of Object.entries(No)) {
console.log(key);
}
浅拷贝,深拷贝
浅拷贝
let No={
name: '不忘',
faceValue:'很高',
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
}
}
let Nof=Object.assign({},No)
let Nos={}
for (const key in No) {
Nos[key]=No[key]
}
let Not={...No}
No.faceValue='高出天际'
console.log(Nof);
console.log(Nos);
console.log(Not);
深拷贝
let No={
name: '不忘',
faceValue:'很高',
girlfriend:{
name: '冰冰',
address: '北京'
},
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
}
}
function deepCopy(object) {
let newObject={}
for (const key in object) {
newObject[key]= typeof object[key]==='object'?deepCopy(object[key]):object[key]
}
return newObject;
}
let Not=deepCopy(No)
No.girlfriend.name='黑嘉嘉'
console.log(Not);
创建对象
工厂模式创建对象
function boy(name,age){
return {
name,
age,
isDog(){
console.log(this.name+'今年'+this.age+'岁了'+',还是单身狗');
}
}
}
let zhangsan=new boy('张三','20')
let lisi=new boy('李四','23')
zhangsan.isDog()
lisi.isDog()
构造函数创建对象
function boy(name,age){
this.name=name,
this.age=age,
this.isDog=function(){
console.log(this.name+'今年'+this.age+'岁了'+',还是单身狗');
}
}
let zhangsan=new boy('张三','20')
zhangsan.isDog()
封装和抽象
function boy(name,age){
data={name,age},
this.isDog=function(){
console.log(data.name+'今年'+data.age+'岁了'+',还是单身狗');
}
}
let zhangsan=new boy('张三','20')
zhangsan.isDog()
对象的属性特征
查看属性特征
let No={
name: '不忘',
faceValue:'很高',
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
}
}
console.log(JSON.stringify(Object.getOwnPropertyDescriptor(No,'name'),null,2));
console.log(JSON.stringify(Object.getOwnPropertyDescriptors(No),null,2));
// {
// "value": "不忘", //值
// "writable": true,//可写入,可修改
// "enumerable": true,//可遍历,可查询
// "configurable": true,//可重配置,可删除
// }
设置属性特征
let No={
name: '不忘',
faceValue:'很高',
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
}
}
Object.defineProperty(No, 'name', {//设置单个
value: '回忆',
writable: true,
enumerable: true,
configurable: true
})
Object.defineProperties(No,{//设置多个
name:{
value: '回忆',
writable: true,
enumerable: true,
configurable: true
},
faceValue:{
value: '',
writable: true,
enumerable: true,
configurable: true
}
})
不允许添加属性
let No={
name: '不忘',
faceValue:'很高',
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
}
}
Object.preventExtensions(No)//禁止添加属性
Object.isExtensible(No)//是否添加属性
封闭对象:不能添加,删除,修改对象特征
let No={
name: '不忘',
faceValue:'很高',
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
}
}
Object.seal(No)//封闭对象
Object.isSealed(No)//是否封闭对象
冻结对象
let No={
name: '不忘',
faceValue:'很高',
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
}
}
Object.freeze(No)//冻结对象
Object.isFrozen(No)//是否冻结对象
访问器
基础用法
let No={
name: '不忘',
data:{age:20},
faceValue:'很高',
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
},
set age(value){ //数据修改时触发
if (value>18) {
console.log('成年了');
} else{
return console.log('小屁孩');
}
this.data.age=value
},
get age(){ //查寻数据是触发
return this.data.age
}
}
No.age=12
console.log(No.age);
伪造属性
let No={
name: '不忘',
faceValue:'很高',
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
},
get girlfriend(){
return '冰冰,黑嘉嘉'
}
}
console.log(No.girlfriend);
访问器优先级:访问器优先级更高
let No={
name: '不忘',
faceValue:'很高',
girlfriend:'冰冰',
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
},
get girlfriend(){
return '黑嘉嘉'
}
}
console.log(No.girlfriend);
proxy代理
基础用法
let No={
name: '不忘',
faceValue:'很高',
haveGirl(){
console.log(this.name+'有无数妹子,因为他的颜值'+this.faceValue);
}
}
let proxy=new Proxy(No,{
get(obj,property){
return obj[property]
},
set(obj,property,value){
obj[property]=value
}
});
console.log(proxy.name);
proxy.name='回忆'
console.log(proxy.name);
console.log(proxy);
控制函数
function factorial(num) {
return num==1?1:num*factorial(num-1)
}
let proxy=new Proxy(factorial,{
apply(func,obj,args){
console.log(func);
console.log(obj);
console.log(args);
}
});
proxy.apply({a:1},[5])