es6 对象的扩展

一、现在还有很多浏览器不能直接使用es6语法。特别是手机端的一些低版本的浏览器。都需要用bale转换一下。

但是目前流行的框架中(vue,react,angular)。都有自己的脚手架,都能用webpack转换下。或者直接自己配置webpack , fis3,nowa 等转换。

照样不是美滋滋。

二、属性的简洁写法 

//1.属性简洁表示语法
        var foo = 'bar';
        var obj = {foo};
        console.log(obj);
        //创建对象的函数
        function createOjb(x = 1,y = 1){  //x = 1, y = 1; 参数的默认值
            return {
                x,y
            }
        }
        var newObj = createOjb(); 
        console.log(newObj); //{x:1,y:1} 
        var birthDate = '2017/8/12'
        //2 方法的简写
        var person = {
            name:'绿巨人',
            age:'200岁',
            birthDate,
            say(){
                console.log(this.name);  //等同于  say:function(){ console.log(this.name)};
            }
        }
        person.say();  // 绿巨人
        //in  方法
         var msg = {
            hello:'helloValue',
            world:'worldValue'
         }
         console.log('hello' in msg,'helloValue' in msg); 
         // true,false; => 判断某个键值是在某个对象里面
         //commonJS 模块化输出
         function Obj(methods){
            this.methods = methods || {};
         }
         Obj.prototype.getItem = function(key){
            return key in this.methods ? methods[key] : null;
         }
         Obj.prototype.setItem = function(key,value){
            this.methods[key] = value;
         }
         var obj = new Obj();
         //module.exports = {obj};
         //4.注意点  :简洁写法的属性名总是字符串,这会导致一些看上去比较奇怪的结果。

三、属性表达式

//属性名表达式
         // 1. 对象添加属性的两种方式
         var newObj = new Object();
         newObj.name = 'html';
         newObj['age'] = '20岁';
         //对象字面量的方式  se5 中字面量方式下 属性名字只能用 字符串形式。不能用 ['name']
         var newObj1 = {
            name:'css',
            age:'30岁'
         }
         //SE6
         var newObj2 = {
            ['name']:'js',
            ['a' + 'ge']:'40岁',
            ['hello world']:'say hello world',
            ['say' + ' hi'](){
                console.log(this['hello world'])
            }
         }
         console.log(newObj2.name); // jss
         console.log(newObj2['hello world']);  // say hello world
         newObj2['say hi'](); // say hello world
         //!!!注意  属性名表达式是不能喝属性简写一起使用的
         var objKey = {a:1};
         var newObj3 = {
            [objKey]:'我是一个对象'
         }
         console.log(newObj3);  // {[object object]:'我是一对象'}
         console.log(newObj3[{a:1}]); // 我是一个对象  
         console.log(newObj3['object object']); // undefined  是不是很奇怪啊

 四、Object.is()

//Object.is();
         //1.es5中
         console.log(+0 === -0); // true
         console.log(NaN === NaN);  //false
         //2.es6中
        console.log(Object.is(+0,-0)); //false
        console.log(Object.is(NaN,NaN)); //true
        //在ES5中部署Object.is(); 方法
        Object.defineProperty(Object,'is',{
            value(x,y){
                if(x === y){
                    return x !== 0 || 1/x === 1/y;
                }
                //针对NaN的情况
                return x !== x && y !== y;
            },
            configurable:true,
            enumerable:false,
            writable:true
        })

五、Object.assign()

 //Object.assign();  对象的合并  熟悉jquery 的人 var defaults = {a : 1} $.extend({},{},defaults || //{});
        var target = {name:'es6'};
        var target1 = {age:'5年'};
        var target2 = {name:'es7'};
        var target3 = {sex:'body'};
        var defaults = {};
        Object.assign(defaults,target,target1,target2,target3);
        console.log(defaults);  //  {name: "es7", age: "5年", sex: "body"}
        //从上面的defaults  的值可以看出 后面的属性会覆盖前面的属性。跟$.extend({} ,defaults || {});  
        // 一个道理
        defaults.name = 'es8';
        console.log(defaults); //{name: "es8", age: "5年", sex: "body"}
        console.log(target2); //{ name:"es7"}
        /*
            !!! 注意 :: =>  由此可以看出 Object.assign();  是一个深拷贝的方法
            !!!!!! (前提是目标某个原对象中没有对象属性)
            ex:target = {
                family:{
                    child:'七七'
                }
            }
            目标对象属于对象属性时。就是浅拷贝啦。 跟 $.extend(true,{} , defaults || {}); 方法有区别。加了true 对象属性也进行深拷贝
        */
            var tar = {
                family:{
                    child:'七七'
                }
            }
            var defaults1 = {

            };
            Object.assign(defaults1,tar);
            console.log(defaults1); // { family:{child:"七七"}};
            defaults1.family.child = "琪琪";
            console.log(defaults1); // { family:{child:"琪琪"}};
            console.log(tar); // { family:{child:"琪琪"}};
//注意点2
            // :: !!! Ojbect.assign() 方法只能克隆原对象。不能够克隆其继承的属性。
            function cloneObject(obj){
                  let originProto = Object.getPrototypeOf(obj);
                    return Object.assign(Object.create(originProto), obj); 
            }
            // Object.create()  方法是对其原型

六、属性的可枚举性

 //对象的可枚举性
            var objEn = {};
            Object.defineProperty(objEn,'foo',{
                value:'不可枚举',
                configurable:true,
                enumerable:false,
            }) 
            console.log(Object.getOwnPropertyDescriptor(objEn,'foo'));
            //{value: "不可枚举", writable: false, enumerable: false, configurable: true}
    /*
        描述对象的enumerable属性,称为”可枚举性“,如果该属性为false,就表示某些操作会忽略当前属性。
        ES5 有三个操作会忽略enumerable为false的属性。
        for...in循环:只遍历对象自身的和继承的可枚举的属性
        Object.keys():返回对象自身的所有可枚举的属性的键名
        JSON.stringify():只串行化对象自身的可枚举的属性
        ES6 新增了一个操作Object.assign(),会忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性。
       */

七、属性的遍历 

//属性的遍历
        var ojbEach = {
            name:'es8',
            age:'100年'
        }
        Object.defineProperty(ojbEach,'bar',{
            value:'不可枚举',
            enumerable:false,
            writable:true,
            configurable:true
        })
        //方法1 for  in 循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。
        for(var key in ojbEach){
            console.log(ojbEach[key]); // es8 100年
        }
        //方法2  Object.keys(); 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)。
        var objArr = Object.keys(ojbEach);  //
        console.log(objArr); // ["name", "age"]
        /*
        方法3 Object.getOwnPropertyNames 返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)。
        */
        var objEnArr = Object.getOwnPropertyNames(ojbEach);//
        console.log(objEnArr); //["name", "age", "bar"]
        //方法4 Object.getOwnPropertySymbols(obj) 返回一个数组,包含对象自身的所有 Symbol 属性。
      /*方法5 Reflect.ownKeys返回一个数组,包含对象自身的所有属性,不管属性名是 Symbol 或字符串,也不管是否可枚举。
    */

 

posted @ 2017-08-12 19:16  aGod  阅读(556)  评论(0编辑  收藏  举报