对象的扩展

Posted jeff-zhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象的扩展相关的知识,希望对你有一定的参考价值。

属性的简洁表示法

var foo = ‘bar‘;

var baz = {foo};

baz   // {foo: ‘ bar ‘ }

等同于  var baz = {foo:foo};

es6中允许在对象中只写属性名,不写属性值。这时属性值等于属性名所代表的变量。

function f ( x, y) {

  return {x,y}

}

//等同于

function f (x ,y){

  return {x:x,y:y};

}

除了属性可以简写,方法也可以简写

var o = {

  method(){

    return ‘hello‘;  

  }

}

//等同于

var o = {

  method : function(){

    return ‘hello‘;  

  }

}

注意简介写法属性名总是字符串

属性名表达式

obj [‘a‘+‘bc‘] = 123;

let propkey = ‘foo‘;

let obj = {

  [propkey] : true,

  [‘a‘+‘bc‘]  : 123

}

Object.is()

比较两个值是否相等与 

Object.is( ‘foo‘ , ‘foo‘ )    // true

与===基本一致 ,不同之处只有两个

+0 不等于-0       NaN等于NaN

Object.assign()

用于将源对象的所有自身可枚举属性复制到目标对象

Object.assign(target,source);  第一个参数是目标对象,后面的参数是源对象

如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性

属性的可枚举属性

对象的每一个属性都具有一个描述对象(Descriptor),用于控制该属性的行为

Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象

let obj = { foo: 123};

Object.getOwnPropertyDescriptor( obj , ‘foo‘ );

{

value : 123,

writable : true,

enumerable : true,

configurable : true

}

描述对象的enumerable属性称为可枚举性,如果该属性为false就表示某些操作会忽略当前属性

es5有三个操作会忽略enumerable为false的属性,

for ... in  :只遍历对象自身和继承可枚举属性

Object.keys()  : 返回对象自身的所有可枚举属性的键名

JSON.Stringify()  :只串行化对象自身的可枚举属性

es6新增了一个操作 Object.assign() 会忽略enumerable为false的属性

另外es6规定所有class的原型方法都是不可枚举的

总的来说,操作中引入继承的属性会让问题复杂化,大多数的时候,我们只关心对象自身的属性。所以尽量不要用for...in循环,而用Object.keys()代替。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于对象的扩展的主要内容,如果未能解决你的问题,请参考以下文章

javascript 对象的扩展性

对象的扩展

[扩展推荐]阿里云对象存储扩展 —— Laravel最好的Aliyun OSS Storage扩展

ES6 对象的扩展

JS中禁止对象属性扩展密封对象冻结对象

ES6新特性内置对象的扩展方法