对象字面量结构
var o = {
"name": "tom",
"age": 16,
"say": function() {
console.log("我叫tom,今年16岁");
}
}
- 在js中对象的key都是字符串
- 对象的value可以是任意类型
- 所有的key都是对象的成员变量
- 如果一个key对应的是非函数值,就称为对象属性
- 如果一个key对应的是函数值,就称为对象方法
描述符
var stu = {
name: "tom",
birthday: "1995-08-01",
ID: 341226199508011574
}
Object.defineProperty(stu, "age", {
value: 20,
configurable: true, //默认是false
enumerable: true, //默认是false
writable: true //默认是false
})
delete stu.age //删除
for (var key in stu) { //遍历
console.log(key);
}
stu.age = 18 //修改
console.log(stu);
value
[ˈvæljuː]
属性的值
configurable
美 [kənˈfɪgjərəbl]
可配置性:是否可用
delete
删除
enumerable
[ɪ'njʊmərəbl]
可枚举性:是否可用
for...in
遍历
writable
美 [ˈraɪtəbl]
可写性:是否可以更改属性的值
获取对象的属性描述符
Object.getOwnPropertyDescriptor(obj, "name"); //获取属性名为name的属性描述符
Object.getOwnPropertyDescriptors(obj) //获取当前对象的所有属性的属性描述符
get
和set
出现时value
和writable
就没用了
get 一定要有返回值,set可以没有返回值
get
和 set
操作
两个操作做是互相作用的,在做动态数据时使用
var o = {
name: "小霸王学习机",
price: 100
}
Object.defineProperty(o, "dollar", {
get: function() {
return this.price * 0.14;
},
set: function(value) {
this.price = value / 0.14;
},
enumerable: true,
configurable: true
})
console.log(o.dollar); //激活get操作
o.dollar = 10 //只是为了激活set操作
console.log(o.dollar); //激活get操作
获得对象的属性名(对象的遍历)
-
for...in
-
key指的是遍历对象的属性名
-
对象名[key]遍历对象的属性值
-
-
Object.keys()
- 会将对象中所有可遍历的属性拿出来组成一个数组
-
Object.getOwnPropertyNames()
-
会将对象中所有属性拿出来组成一个数组
-
可以遍历到enumerable:false的属性
-
判断当前对象中是否有某个属性
- 通过
in
关键字
console.log("name" in stu);
- 通过
hasOwnProperty()
console.log(stu.hasOwnProperty("name"));
函数中用Object.defineProperties()
创建对象
function Person(_name,_ID,_birthday){
// 构造函数的内部,this直接指向当前对象
Object.defineProperties(this,{
name:{
value:_name,
configurable:false
},
ID:{
value:_ID
},
birthday:{
value:_birthday
},
sex:{
get:function(){
return this.ID[16] % 2 == 0?"女":"男"
}
},
age:{
get:function(){
var now = new Date();
var bd = new Date(this.birthday);
var a = now.getTime() - bd.getTime();
var year = parseInt(a / 1000 / 60 / 60 / 24 / 365);
return year;
}
}
})
}
var coolBoy = new Person("刘光礼","420000200003033456","2000-03-03");
console.log(coolBoy);
console.log(coolBoy.age);
console.log(coolBoy.sex);