_Doogie
2016-09-06 12:47
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方法继续尝试,如果两种都无法将对象转化为基本类型则会报错
看不懂,就要多学习,没有人一下就能看懂的,看不懂就从最基础开始学习
JavaScript深入浅出
281099 学习 · 1020 问题
相似问题