创建对象
字面量
var obj = {
x:1,
y:2
}
构造器
var obj = new Object();
自定义函数对象:
function Man(){
this.z=1
};
var pepo = new Man();
pepo.z //1
原型链继承
var obj = Object.create(pepo); //原型链继承pepo对象
obj.z //2
obj.z =3 //3
delete obj.z //true
obj.z //2
特例:
var obj = Object.create(null);
typeof obj.toString //"undefined" 因为原型链是null null没有toString方法
读写对象属性
读
对象名称.属性名称 (obj.z)
对象名称[属性名称](obj[z])
注意:[]可以用于拼接。
读不存的属性返回:undefined
var yz = obj && obj.y && obj.y.z
// obj 没有 就返回undefined
// obj.y没有 就返回undefined
// obj.y.z没有 就返回undefined有就返回obj.y.z
get set 方法
//直接用age进行属性获取和赋值
var man = {
$age:null,
get age(){
return this.$age,
},
set age(val){
this.$age = val;
},
}
//原型链上,遇到get set 就会先用get 和 set
function foo(){};
Object.defineProperty(foo.prototype,'z',{
get:function(){
return 1;
}
});
var obj = new foo();
obj.z //1
obj.z = 100; //100
obj.z //1
//原型链上有get set 就用原型链的get 和 set。本案例原型链没有set 所以无法赋值。
//若要使用,可以重写obj的属性z defineProperty都是false
Object.defineProperty(obj,'z',{
writable: true, enumerable: true, configurable: true
});
属性级的权限设置
属性值 value
是否可枚举 enumerable
是否可写 writable
是否可删除configurable
//初始
var obj = {
x:1
}
//看
Object.getOwnPropertyDescriptor(obj,'x');
//{value: 1, writable: true, enumerable: true, configurable: true}
//创建
Object.defineProperty(obj,'z',{
value:3,writable: true, enumerable: true, configurable: true
})//{x: 1, z: 3}
//defineProperties多个属性设置
Object.defineProperties(obj,{
'a':{value:3,writable: true, enumerable: true, configurable: true},
'b':{value:3,writable: true, enumerable: true, configurable: true}
})//{x: 1, z: 3, a: 3, b: 3}
对象标签
[proto] 原型
[class] 对象的类型 Object.prototype.toString 先转为对象再判断
[extensible] 对象是否可扩展
extensible 说明:
对象否可扩展查询
Object.isExtensible(obj);
对象禁止添加属性(不会影响属性)
Object.preventExtensions(obj);
将对象的所有属性 configurable设为false(seal会影响属性 但是不会影响原型链的属性):
Object.seal(obj);
对应的查询:
Object.isSeal(obj);
对象所有属性冻结(会影响属性 不会影响原型链)
Object.freeze(obj);
对应的查询:
Object.isFroze(obj)
序列化/其它对象化
对象转JSON
JOSN.stringify(obj);//转json ;
缺点:
- 值是undefind 属性会丢掉
- 值是NaN 转为 null
- 时间会转为UTC
JSON转对象
JOSN.parse(obj);
序列化自定义
序列化-自定义
var obj = {
x:1,
y:2,
o:{
o1:1,
o2:2,
toJSON:function(){
return this.o1 + this.o2;//返回自定义的o
}
}
};
JSON.stringify(obj);
//"{"x":1,"y":2,"o":3}"
其它对象方法
对象先转为基本数据类型,既调用valueOf。
然后判断valueOf返回值是否为基本数据类型,若是就用valueOf返回值进行逻辑操作。
若不是就调用toString()方法。
var obj = {x:1,y:2};
obj.toString(); //"[object Object]"
//重写toString
obj.toString = function(){
return this.x + this.y;
};
'c'+obj //"c3" 对象加号前先调用了toString
//重写valueOf
obj.valueOf = function(){
return this.x + this.y+100;
};
'c'+obj //"c103" toString 和 valueOf 都存在,先调用valueOf。