js对象-定义属性及对象序列化

es(ECMAScript)中有两种属性:数据属性、访问器属性。用于设置对象属性(eg:name)的高级属性,比如该属性是否可删除、遍历、读写等。

一、数据属性

对象是由多个键值对组成的无序集合,对象中每个属性可以是任意类型的值。修改数据属性的默认特性,必须使用es5的Object.defineProperty()方法,修改多个数据属性特性时可使用Object.defineProperties()方法

数据属性特性:

Configurable:表示可否通过delete删除属性重新定义属性。默认为true,可以使用delete删除属性重新定义。

Enumerable:表示能否通过for-in循环返回属性。默认为true

Writable:表示能否修改属性的值。 默认为true

Value:表示这个属性的值

1、定义数据属性特性

Object.defineProperty()方法

语法:Object.defineProperty(obj(目标对象), prop(要修改或定义的属性名), descriptor(要定义的目标属性特性))三个参数都必须写

eg: 

//student 目标对象  name要定义的属性  {...}要修改的数据属性特性
Object.defineProperty(sutdent,'name',{
   configurable:true,  //可删除属性
   enumerable:true,    //可返回属性值
   writable:true,      //可修改name的值
   value:'zhangsan'    //属性值
})
//sutdent目标对象必须存在

 Object.defineProperties()方法

语法:Object.defineProperties(obj(目标对象), props(该对象要定义的一个或多个属性的数据属性特性))

var student = new Object();
Object.defineProperties(student, {
    name: {
        value: 'zhangsan',   
        configurable: false, //不可删除
        writable: true,
        enumerable: true
    },
    age: {
        value: 18
    }
})
delete student.name 
console.log(student.name, student.age) // 打印结果zhangsan, 18   
                                       //delete student.name删除失败

2、获取属性特性

Object.getOwnPropertyDescriptor() 

语法: Object.getOwnPropertyDescriptor(obj(目标对象), prop(要获取属性特性的属性名))                  功能:返回目标对象中某个属性的数据属性特性

var student = {
    name: 'zhangsan',
    age: 18,
    height: 1.78
}
var res = Object.getOwnPropertyDescriptor(student, 'name'); 
var decs = Object.getOwnPropertyDescriptor(student, 'age');
console.log(res)  
//{ value: 'zhangsan', writable: true, enumerable: true, configurable: true }
console.log(decs)
//{ value: 18, writable: true, enumerable: true, configurable: true }

Object.getOwnPropertyDescriptors()

语法: Object.getOwnPropertyDescriptors(obj(目标对象对象名))                                                        功能:返回目标对象所有自身属性的数据属性特性,如果目标对象为空对象,则返回一个空对象

var student = {
     name: 'zhangsan',
     age: 18,
}
var res = Object.getOwnPropertyDescriptors(student);
console.log(res) 
//返回结果
{
  name: { value: 'zhangsan', writable: true, enumerable: true, configurable: true },
  age: { value: 18, writable: true, enumerable: true, configurable: true }      
}
var student = {}
var res = Object.getOwnPropertyDescriptors(student);
console.log(res) 
//返回结果为{}

二、访问器属性特性

访问器属性特性:

Configurable:表示能否通过delete删除属性从而重新定义属性,默认为false

Enumerable:表示能否通过for-in循环返回属性,默认为false

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

Set:在写入属性时调用的函数,默认值为undefined

访问器属性:不包含数值,需要通过Object.defineProperty()方法定义

Object.defineProperty()

var book = {
    _year: 2020, //下划线表示内部属性,只能通过对象的方法来读写
    editor: 1
  };
  Object.defineProperty(book, 'year', {
    get: function () {
      return this._year;
    },
    // 若只指定get方法,不指定set方法,那就默认该属性是只读的
    set: function (newYear) {
      if (newYear !== this._year) {
        this._year = newYear
        this.editor ++
      }
    }
  });
  // 测试访问属性中的get,set方法
  console.log('未修改的year:' + book.year);
  book.year = 2021;
  console.log('修改后的year:' + book.year);
  console.log('修改year后的editor:' + book.editor);
  // 问器属性可以通过Object.getOwnPropertyDescriptor()查询
  console.log(Object.getOwnPropertyDescriptor(book, '_year')); 
// { value: 2021, writable: true, enumerable: true, configurable: true } 

三、对象序列化 

什么是对象序列化?

对象序列化即是指将对象转换为Json字符串。同样的反序列化就是将Json字符串转换成对象

RegExp(正则表达式)、function、undefined值和Error对象不能序列化和反序列化

对象序列化

语法:JSON.stringify(obj)  obj:表示目标对象

//将对象转换成JSON字符串
var student = {
    name:'zhangsan',
    age:18,
    cj:[99,99,99,99]
};
console.log(student);
//student对象打印结果 { name: 'zhangsan', age: 18, cj: [ 99, 99, 99, 99 ] }
// 将对象转换为JSON字符串JSON.stringify(obj)
var json = JSON.stringify(student);
console.log(json);
//打印结果 {"name":"zhangsan","age":18,"cj":[99,99,99,99]}

对象反序列化

语法:JSON.parse(jsonStr)      jsonStr:目标字符串

// 将JSON字符串转换为对象
var student = {
	name:'zhangsan',
	age:18,
  cj:[99,99,99,99]
};
var json = JSON.stringify(student);
console.log(json); //{"name":"zhangsan","age":12,"cj":[99,99,99,99]}
// 将JSON字符串转换为对象 JSON.parse(jsonStr)
var obj = JSON.parse(json);
console.log(obj);  //{ name: 'zhangsan', age: 18, cj: [ 99, 99, 99, 99 ] }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值