美文网首页
创建Object及Object.defineProperty()

创建Object及Object.defineProperty()

作者: 诺奕 | 来源:发表于2017-11-08 21:53 被阅读240次
  • 前言:最近在看vue数据双向绑定的时候尤大神追踪数据变化并通知相关“人员”,Object.defineProperty 把这些属性全部转为 getter/setter。
    待整理
<script type="text/javascript">
    /*
       Object.create(prototype[,descriptors])
       创建一个对象,并把其prototype属性赋值为第一个参数,同时可以设置多个descriptors。
    */
    var Cat = Object.create({
        "name": 'miaomiao',
        'food': function() {
            alert('I love fish');
        } 
    });
    console.log('猫实例', Cat);
    console.log('================================================================');
    /* 
        Object.defineProperty(obj, prop, descriptor)
        1. value: 任何值,默认是undefined
        2. writable: 是否可以被重写,默认是false
        3. enumerable: 是否可以被循环(使用for...in或Object.keys()), 默认是false
        4. configurable: 是否可被删除,是否可以再次设置特性
        5. get: 返回property的值的方法,默认是undefined
        6. set: 为property设置值的方法,默认是undefined
    */
    var person = Object.create({})
    Object.defineProperty(person ,'age', {
        value: '24',
        writable: true,  //只读
        enumerable: true, //可被循环
        configurable: true //可被删除
    });
    Object.defineProperty(person, 'name', {
        value: 'datura_lj',
        writable: false, //可修改
        enumerable: false, //不可被循环
        configurable: false //不可被删除
    });

    console.log('person', person);

    person.age = 17;
    person.name = 'shuaishuai';
    console.log(person);

    for (var key in person) {
        console.log(key + ':' + person[key]);
    }
    delete person.age;
    delete person.name;
    console.log(person);
    /* 
        Object.defineProperties(); 批量设置
    */
    Object.defineProperties(person, {
        'job': {
            value: '搬砖的',
            writable: true,
            enumerable: true,
            configurable: true
        },
        'sex': {
            value: 'man',
            writable: false,
            enumerable: false,
            configurable: false
        }
    });
    console.log(person);
    /*
        Object.getOwnPropertyDescriptor(obj, property) 
        获取defineProperty方法设置的property 特性(只读,删除等)
    */
    console.log(Object.getOwnPropertyDescriptor(person, 'job'));
    /*
        Object.getOwnPropertyNames(obj)
        //获取所有的属性名,不包括prototy中的属性,返回一个数组
    */
    console.log(Object.getOwnPropertyNames(person));
     /*
        Object.keys(obj)
        和getOwnPropertyNames方法类似,但是获取所有的可以循环的属性,返回一个数组
    */
    console.log(Object.keys(person));
    console.log('================================================================');
    /*
        Object.preventExtensions(obj)  锁住对象属性,使其不能够拓展,也就是不能增加新的属性,但是属性的值仍然可以更改,也可以把属性删除
        Object.isExtensible(obj)  用于判断对象是否可以被拓展,返回值为true/false
    */
    console.log(Object.isExtensible(person)); //true  判断对象是否可以被拓展
    person.hobby = 'money';
    console.log(person.hobby); //money ,此时对象可以拓展

    Object.preventExtensions(person);
    console.log(Object.isExtensible(person)); //false  判断对象是否可以被拓展

    person.hobby = "code";
    console.log(person.hobby); //code,属性值仍然可以修改

    console.log(person.hobby); //undefined仍可删除属性
    delete person.hobby;
    console.log(person.hobby); //undefined仍可删除属性

    person.like = 'woman'; //Can't add property firstname, object is not extensible 不能够添加属性
    console.log(person.like);
    console.log('================================================================');
    /*
        Object.seal(obj) 让对象既不可以拓展也不可以删除属性(把每个属性的configurable设为false),单数属性值仍然可以修改;
        Object.isSealed由于判断对象是否被密封
    */
    Object.seal(person);
    person.name = '007'; //仍然可以修改
    console.log(person.name)
    delete person.name; //Cannot delete property 'age' of #<Object>
    console.log(person.name)
    console.log('================================================================');
    /*
        Object.freeze(obj) 完全冻结对象,在seal的基础上,属性值也不可以修改(每个属性的wirtable也被设为false)
    */
    Object.freeze(person);
    person.aaa = 25; //Cannot assign to read only property 'age' of #<Object>
    console.log(person.aaa)
</script>

相关文章

网友评论

      本文标题:创建Object及Object.defineProperty()

      本文链接:https://www.haomeiwen.com/subject/odkumxtx.html