es6 對象的擴展

来源:http://www.cnblogs.com/nmxs/archive/2017/12/16/8047222.html
-Advertisement-
Play Games

1.屬性的簡潔表示法 function f(x,y) { return {x,y}; } // 等同於 function f(x,y){ return {x:x,y:y}; } f(1,2) // Object {x:1,y:2} 例如: let birth = '2000/01/01'; cons ...


1.屬性的簡潔表示法     function f(x,y) {       return {x,y};     }     // 等同於     function f(x,y){       return {x:x,y:y};     }     f(1,2)   // Object {x:1,y:2}     例如:       let birth = '2000/01/01';       const Person = {         name: '張三',           // 等同於 birth: birth         birth,           // 等同於hello: function()...         hello() {console.log('我的名字',this.name);}       };     例如:用於函數的返回值     function getPoint() {         const x = 1;         const y = 10;         return {x,y};     }     console.log(getPoint());       // {x:1,y:10}     2.屬性名錶達式     表達式作為對象的屬性名       let obj = {         [propKey]: true,         ['a' + 'bc']:123       };       console.log(obj[propKey]); // true       console.log(obj['abc']); // 123     例如:       let lastWord = 'last word';       const a = {         ‘first word’: 'hello',         [lastWord]: 'world'       }       console.log(a['first word']); // "hello"       console.log(a[lastWord]); // "world"       console.log(a['last word']); // "world"     例如: 表達式可以用於定義方法名       let obj = {         ['h'+'ello']() {           return 'hi';         }       };       console.log(obj.hello()); // 'hi'   3.方法的 name 屬性     例如:函數的name 屬性,返回函數名。       const person = {         sayName() {         console.log('hello');         }       }       console.log(person.sayName.name); // "sayName" 4.Object.is()     ES 比較兩個值是否相等,只有兩個運算符,相等運算符,相等運算符(==)     和嚴格相等運算符(===)         +0 === -0 // true       NaN === NaN // false       Object.is(+0,-0); // false       Object.is(NaN,NaN) // true 5.Object.assign()     Object.assign 方法用於對象的合併,將源對象的所有的可枚舉屬性,賦值到目標對象     例如;       const target = {a:1};       const source1 = {b:2};       const source2 = {c:2};       Object.assign(target,source1,source2);       console.log(target); // {a:1,b:2,c:3}     例如:同名屬性的替換,當遇到同名屬性的時候,處理方法是替換。       const target = {a:{b:'c',d:'e'}}       const source = {a: {b:'hello'}}       console.log(Object.assign(target,source))         // {a: {b:'hello'}}     例如: 數組的處理       Object.assign 可以用來出來數組,把數組作為對象看       Object.assign([1,2,3],[4,5])         // [4,5,3]       常見用途(1) 為對象添加屬性         class Point {           constructor(x,y){             Object.assign(this,{x,y});           }         }     常見用途(2) 為對象添加方法       Object.assign(SomeClass.prototype,{         someMethod(arg1,arg2){           .....         }       anotherMethod(){         ...         }       })     常見用途(3) 克隆對象       function clone (origin) {         return Object.assign({},origin);       } 6.屬性的可枚舉行和遍歷     可枚舉性       Object.getOwnProperDescriptor 方法可以獲取該屬性的描述對象         let obj = {foo:123};       Object.getOwnPropertyDescriptor(obj,'foo')         // {           value: 123,           writable: true,           enumerable: true,           configurable:true         }     描述對象的enumerable 屬性,稱為“可枚舉屬性” 如果該屬性的值為false,       就表示會忽略當前屬性。     目前有四個操作會忽略 enumerable 為false 屬性。       for...in , Object.keys(), JSON.stringify(), Object.assign();       ES6一共有5種方法可以遍歷對象的屬性         (1) for ... in             迴圈遍歷對象自身的和繼承的可枚舉屬性         (2) Object.keys(obj)             Object.keys 返回一個數組,包括對象自身的所有可枚舉屬性         (3) Object.getOwnPropertyNames(obj)             Object.getOwnPropertyNames 返回一個數組,包含對象自身的所有屬性         (4) Object.getOwnPropetrySymbols(obj)             Object.getOwnPropetrySymbols 返回一個數組,包含對象自身的所有             Symbol屬性的鍵名。         (5) Reflect.ownKeys(Obj)           Reflect.ownKeys 返回一個數組,包含對象自身的所有鍵名。 8._proto_ 屬性。     _proto_ 屬性,用來讀取和設置當前對象的protoype對象。       const obj = {         method: function(){           console.log(111)         }       }     obj._proto_= someOtherrObj;     Object.setPrototypeOf()     Object.setPrototypeOf 方法的作用與 _proto_ 相同,用來設置一個對象的prototype對象       返回參數對象本身,。         // 格式       Object.setPrototypeOf(object,prototype)         // 用法       const o = Object.setPrototypeOf({},null);         Object.getPrototypeOf()         該方法與Object.setPrototypeOf 方法配套,用於讀取一個對象的原型對象。             Object.getPrototypeOf(obj); 9.super 關鍵字     this 關鍵字總是指向函數所在的當前對象,super 指向當前對象的原型對象。       const proto = {         foo: 'hello'       };       const obj = {         find(){         return super.foo;         }       }       Object.setPrototypeOf(obj,proto);       obj.find(); 10.Object.keys() ,Object.values(),Object.entries()     let {keys,values,entries} = Object;     let object = {a:1,b:2,c:3};     for (let key of keys(obj)){       console.log(key); // 'a','b','c'     }     for(let key of keys(obj)){       console.log(key);// 'a','b','c'     }     for(let value of values(obj)){       console.log(key); // 1,2,3       }     for (let [key,value] of entries(obj)){       console.log([key,value]); // ['a',1],['b',2],['c',3]     } 11.對象的擴展運算     對象的結構賦值用於從一個對象取值,相當於將所有可遍歷的,但尚未對齊的屬性,     分配到指定的對象上面,所有的鍵和值他們的值,都會拷貝到新對象上面。       let {x,y,...z} = {x:1,y:2,a:3,b:4};       x // 1       y // 2       z // {a:3,b:4}       擴展運算       擴展運算符(...) 用於取出參數對象的多有可遍歷屬性,拷貝到當前對象之中。         let z = {a:3,b:4};         let n = {...z};         n // {a:3,b:4}     合併兩個對象       let ab = {...a,...b};         // 等同於       let ab = Object.assign({},a,b)