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方法继续尝试,如果两种都无法将对象转化为基本类型则会报错