对象(1)

对象字面量结构

 var o = {
     "name": "tom",
     "age": 16,
     "say": function() {
         console.log("我叫tom,今年16岁");
     }
 }
  1. 在js中对象的key都是字符串
  2. 对象的value可以是任意类型
  3. 所有的key都是对象的成员变量
  4. 如果一个key对应的是非函数值,就称为对象属性
  5. 如果一个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);
  1. value [ˈvæljuː]

属性的值

  1. configurable 美 [kənˈfɪgjərəbl]

可配置性:是否可用delete删除

  1. enumerable [ɪ'njʊmərəbl]

可枚举性:是否可用for...in遍历

  1. writable 美 [ˈraɪtəbl]

可写性:是否可以更改属性的值

获取对象的属性描述符

Object.getOwnPropertyDescriptor(obj, "name");        //获取属性名为name的属性描述符
Object.getOwnPropertyDescriptors(obj)                //获取当前对象的所有属性的属性描述符

getset出现时valuewritable就没用了

get 一定要有返回值,set可以没有返回值

getset操作

两个操作做是互相作用的,在做动态数据时使用

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操作

获得对象的属性名(对象的遍历)

  1. for...in

    • key指的是遍历对象的属性名

    • 对象名[key]遍历对象的属性值

  2. Object.keys()

    • 会将对象中所有可遍历的属性拿出来组成一个数组
  3. Object.getOwnPropertyNames()

    • 会将对象中所有属性拿出来组成一个数组

    • 可以遍历到enumerable:false的属性

判断当前对象中是否有某个属性

  1. 通过in关键字
console.log("name" in stu);
  1. 通过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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值