JavaScript 对象字面量

 

目录

一. 对象的基本用法

二. 遍历对象

三. 属性的类型

1. 数据类型

2. 访问浏览器属性

3.定义多个属性

4. 检测属性

5. 对象安全防护(对象拓展,对象密封,对象冻结)

四.对象在实际应用中的表现


概念:对象以键值对的形式存储数据。键也就是对象的属性,值就是一个具体的数据。

一. 对象的基本用法

// 通过Object方式创建
let person = new Object();
person.name = "小黑";
person.age = 22;
person.job = "software Engineer";
person.sayName = function () {
    console.log(this.name);   //this指当前对象
}

person.sayName();   //调用person  实例的方法


//通过对象字面量的方式调用
let person = {
    name:"小黑",
    age 22,
    job:"software Engineer",
    sayName(){
        console.log(this.name);
    }
}


//通过  对象名.属性  的方式调用
console.log(person.name);
person.sayName();


//通过  对象名['属性'] 的方式调用 
console.log(person['name']);


//修改数据
person.name = "小红";
console.log(person.name);  // 小红


//删除数据项 
delete person.name;  


//总结:对象的每个属性或方法都由一个名称来标识,这个名称映射到一个值(键值对)   常用于保存多种数据类型

二. 遍历对象

//遍历对象
let obj = {
    name:"鲁班",
    age:18,
    job:"teacher"
}

//遍历对象  (for in)
for(let i in obj){     //i 表示key
    console.log(obj[i]);
}

三. 属性的类型

1. 数据类型

Configurable:表示属性是否可以通过delete删除并重新定义,是否可以修改它的特性, 默认情况是true

Enumerable:表示属性是否可以通过 for-in 循环返回。默认情况下,所有直接定义在对象上的属性这个特性都是true

Writable:表示属性的值是否可以被修改,默认情况下 值为true

Value:包含属性实际的值,默认值为undefined

// Object.defineProperty();方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

//writable
let obj = {};

Object.defineProperty(obj,"name",{
    value:"德玛",
    writable:true     //为true时表示可以被修改
})
obj.name = "德玛西亚";
console.log(obj);



// configurable
let obj = {};

Object.defineProperty(obj,"age",{
    value:20,
    configurable:true   //为true时表示可以被删除
})
delete obj.age;
console.log(obj)



//enumerable 可枚举
let obj = {
    
};

Object.defineProperty(obj,'name',{
    enumerable:false,
    value:'鲁班'
})

Object.defineProperty(obj,'age',{
    enumerable:true,
    value:20
})

Object.defineProperty(obj,'job',{
    enumerable:true,
    value:"coder"
})

console.log(obj);

for(let i in obj){
    console.log(obj[i]);  //20,coder    name属性不可枚举
}

2. 访问浏览器属性

Get:获取函数,在读取属性时调用,默认值为undefined。

set:设置函数,在写入属性时调用,默认值为undefined.

let obj = {};
Object.defineProperty(obj,'name',{
    get(){
        return this.Myname;
    },
    set(newValue){
       this.Myname  = newValue;
    }
})

obj.name = "小橘";

console.log(obj.name);

3.定义多个属性

 let info = {};
 Object.defineProperties(info,{
     name:{
         value:"小橘"
     },
     age:{
         value:20
     },
     job:{
         value:"teacher"
     }
 })

 console.log(info);

4. 检测属性

  // in操作符   判断当前的属性是不是存在于对象中。
   let obj = {myName:'小橘'};
   console.log('myName' in obj);   //true    myName属于 obj中的属性
   console.log('age' in obj);   //false   age不属于obj的属性


 // hasOwnProperty    测试当前属性是不是对象的自有属性
   let obj = {myName:'小橘',age:20};
   console.log(obj.hasOwnProperty("myName"));
   console.log(obj.hasOwnProperty("job"));

// 区别
   let obj = {myName:'小橘',age:20};
   Object.prototype.sayName = "hello world";
   console.log('sayName' in obj);  //true
   console.log(obj.hasOwnProperty('sayName')); //false  只能测试当前属性是不是对象的自有属性

5. 对象安全防护(对象拓展,对象密封,对象冻结)

//阻止对象拓展(阻止拓展)     可以通过Object.isExtensible(对象名)  来检测一下这个对象是否是可拓展的
let obj = {myName:"小橘"};
Object.preventExtensions(obj);   
obj.age = 18;  //undefined  添加不了  

console.log(obj);  //{myName: "小橘"}



//--->过渡
 let obj = {myName:"小橘"};
Object.preventExtensions(obj);
delete obj.myName;

console.log(obj); //可以删除   preventExtensions可以阻止拓展 不能阻止删除



//对象密封(阻止拓展,阻止删除)   可以通过Object.isSealed(对象名)  来判断这个对象是否已经密封
let obj = {myName:"小橘"};
Object.seal(obj);

obj.age = 18;
console.log(obj); //{myName: "小橘"}
delete obj.myName; 
console.log(obj); //{myName: "小橘"}




//--->过渡
let obj = {myName:"小橘"};
 Object.seal(obj);
 obj.age = 18;
 console.log(obj); //{myName: "小橘"}
 delete obj.myName;
 console.log(obj); //{myName: "小橘"}   

 obj.myName = "小橘橘橘子";
 console.log(obj);  //{myName: "小橘橘橘子"}   //对象属性依然可以修改




//对象冻结(这是最严格的防篡改级别,冻结的对象即不可扩展,又密封,且不能修改) 
let obj = {myName:"小橘"};
Object.freeze(obj);

 obj.age = 18;   //不能添加 
 console.log(obj); //{myName: "小橘"}

 delete obj.myName;  //不能删除
 console.log(obj);  //{myName: "小橘"}

 obj.myName = "小橘橘橘子";   //不能修改 
 console.log(obj);  //{myName: "小橘"}

四.对象在实际应用中的表现

 let obj = [
     {
         id:001,
         title:"火影忍者",
         amount:30,
         status:false
     },
     {
         id:002,
         title:"海贼王",
         amount:40,
         status:true
     },
     {
         id:003,
         title:"三国演义",
         amount:20,
         status:false
     },
     {
         id:004,
         title:"西游记",
         amount:50,
         status:false
     }
 ]

  obj.forEach(function(item,value){   
      console.log("编号:"+item.id+"---书名:"+item.title+"---价格:"+item.amount+"---是否有货:"+item.status);   
  })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪漫的宇航员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值