问答详情
源自:4-6 [JavaScript]对象标签、对象序列化

章节笔记002

1)创建对象:字面量和构造函数
var obj = {};	//字面量
var obj = new Object();	//构造函数

2)属性操作
对象里的属性有如下特性:
数据属性:
configurable:设置属性是否能被删除,属性的特性是否能被设置,能否修改属性的值等;
enumerable:设置属性是否可枚举
writable:设置属性的值能否被修改
value:设置属性的值
在添加一个对象的属性时默认上面的特性都为true,而value则是属性的值,如果想通过自定义这些特性来设置对象属性,可以通过Object.defineProperty,如下:
var person = {name:"张三"};
Object.defineProperty(person,name,{configurable:true,enumerable:true,writable:true,value:"李四”});
在上面所设置的特性当中,configurable如果为false表示属性特性设置在之后不能被改动(除了writable,writable在configurable为false时仍然可以设置成false),而且configurable一旦为false后就不能再设置成true了,
而enumberable如果为false则表示该属性不可枚举,用for in循环输出对象属性时该属性不会被输出;
writable很明显,为false时则表示不可修改该属性的值(不过当configurable为true时可以通过修改value的值直接改写或者将writable修改为true)
Object.defineProperty(person,name,{configurable:false});	
delete person.name;	//delete操作不成功
Object.defineProperty(person,name,{enumerable:false});	//操作不成功
...
访问器属性
configurable:设置属性是否能被删除,属性的特性是否能被设置,能否修改属性的值等;
enumerable:设置属性是否可枚举
get / set :在读写属性时会自动调用的函数
比如:
var book = {
   _year:2004,
   edition:1
};
Object.defineProperty(book,"year",{
   get:function(){
        return this._year;
   },
   set:function(newValue){
       this._year = newValue;
       this.edition += newValue - 2004;
   }
});

book.year = 2005;	//当要设置year属性时,会自动调用set方法
alert(book.edition);

如果要的不止是配置单单一个属性,而是要同时配置多个,可以通过Object.defineProperties,如下:
var person = {name:"张三"};
Object.defineProperty(person,{
      name:{value:"李四”,configurable:false},
      sex:{value:"man",writable:false}
});
在配置完属性后或者通过Object.defineProperty更改过属性后想读者该属性,可以通过Object.getOwnPropertyDescriptor读取
Object.getOwnPropertyDescriptor(book,"edition");		//读取book对象中的edition属性


3)对象标签
[[proto]]:
对象中有个属性[[proto]]指向它的构造器的原型

[[class]]:
看不懂视频里在讲啥- -,没说为啥是通过Object.prototype.toString去获取[[class]]的,所以还是不懂[[class]]的含义

[[extensible]]:
var obj = {x:1,y:2};
Object.isExtensible(obj);	//检测对象是否可扩展,一般来说默认都是true
Object.preventExtensions(obj);	//禁止对象可扩展
Object.defineProperty(obj,"x",{value:2});	//虽然禁止了对象扩展,但是删除或者修改属性的值以及标签
Object.seal(obj);	//禁止对象属性被删除以及配置属性标签
Object.isSealed(obj);	//判断对象是否被seal

Object.freeze(obj);	//冻结对象,禁止对象属性值被改写
Object.isFrozen(obj);	//判断对象是否被freeze

4)序列化
在向后台发送请求数据时,用JSON.stringify将对象转化为字符串,用JSON.parse将字符串解析为对象
但是,在用JSON.stringify将对象转化为字符串时如果对象属性的值为undefined,那么它将不会出现在转化后的字符串里
如果我们想自定义序列化,可以在对象里自定义toJSON方法,同理,我们在将对象toString或者valueOf时也可以自定义toString方法和valueOf方法

对象转化为基本类型的过程:
在后台首先会自动调用valueOf方法尝试将对象转化为基本类型,如果valueOf不存在或者无法转化为基本类型则会调用toString方法继续尝试,如果两种都无法将对象转化为基本类型则会报错


提问者:_Doogie 2016-09-06 12:47

个回答

  • qq_包包世界我专业_0
    2016-09-09 22:04:41

    看不懂,就要多学习,没有人一下就能看懂的,看不懂就从最基础开始学习