Object es5-es6扩展总结

一、 Object构造函数的属性

1、Object.length:
2、Object.prototype:可以为所有的Object类型的对象添加属性

es5扩展

es5增加了数据描述符和存取描述符:数据描述符和存取描述符只能存在一种,否则会报错

A、数据描述符

对象是一个属性集合,对象的基本特征是属性名和属性值,es5新增可属性描述符,可以更细腻的控制属性的不同操作,属性描述符有:configurable、writable、enumerable属性描述符通常和 Object.defineProperty/Object.defineProperties 一起使用来定义属性,它也会受到诸如 Object.freeze/Object.seal 等方法改变。

1:configurable:当且仅当 configurable 为 true 时,该属性才能够被改变,也能够被删除(delete),默认为 false
2:writable:writable 当且仅当 writable 为 true 时,该属性才能被赋值运算符(=)改变,默认为 false
3:enumerable: 当且仅当 enumerable 为 true 时,该属性才能够出现在对象的枚举属性(for in)中,默认为 false
备注:使用es3(传统)json方式定义对象:其 configurable/writable/enumerable 默认都是 true
使用 ES5 的 Object.defineProperty/Object.defineProperties 方式定义对象,其 configurable/writable/enumerable 默认都是 false

数据描述符汇总如下:
数据: value :基本的“名/值”、 writable: 属性是否可重写(至少存在一个)
性质:configurable、enumerable

	var obj = {}
	Object.defineProperty(obj, 'name', {
	    value: 'John'
	})
	// 不能 delete
	delete obj.name // false
	Object.defineProperty(obj, 'name', {
	    configurable: true,
	    value: 'John'
	})
	// 可以delete
	delete obj.name // true
	// es3
    var obj = {name: 'John', age: 30}
    //等同于
    Object.defineProperty(obj, 'name', {
	    value: 'John',
	    configurable: true,
	    writable: true,
	    enumerable: true
	})
	Object.defineProperty(obj, 'age', {
	    value: 33,
	    configurable: true,
	    writable: true,
	    enumerable: true   
	})
B、存取描述符

存取描述符是由一对 getter-setter 函数功能来描述的属性
格式为:

	name: {
	    get: function() { ... },
	    set: function(newVal) { ... },
	    enumerable: true,
	    configurable: true
	}

例如:

	var obj = {}
	Object.defineProperty(obj, 'name', {
	    configurable: true,
	    enumerable: true,
	    get: function() {
	        console.log('get')
	        return this.value
	    },
	    set: function(newVal) {
	        console.log('set')
	        this.value = newVal
	    }
	})
	// 赋值会调用 set 方法
	obj.name = 'John'
	// 取值会调用 get 方法
	obj.name

存取描述符汇总如下:
数据:get :取值函数getter、set: 设置函数setter (get\set至少存在一个)
性质:configurable、enumerable

1、Object.create(proto, [propertiesObject]):使用指定的原型对象和属性创建一个新对象

proto:新创建对象的原型对象
ropertiesObject:可选。如果没有指定为 undefined,则是要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。


2、Object.defineProperty(obj, prop, descriptor) :给对象添加一个属性并指定该属性的配置
3、Object.defineProperties():给对象添加多个属性并分别指定它们的配置
4、Object.getOwnPropertyNames(obj):返回一个数组,它包含了对象所有的可枚举或不可枚举的属性名
5、Object.getOwnPropertySymbols():返回一个数组,它包含了指定对象自身所有的符号属性。
6、扩展对象

1、Object.preventExtensions():阻止对象扩展,让一个对象变得不可扩展,也就是永远不能添加新的属性
2、Object.isExtensible():判断对象是否可扩展,即是否可以给它添加新的属性,es5调用Object.preventExtensions()后返回false

   	function extensionsFun () {
             var obj = {name:"zhangsan"}
             console.log(Object.isExtensible(obj))  // true
             obj.sex = "nan"
             //阻止扩展
             Object.preventExtensions(obj)
             obj.age = "33" //严哥模式下会报错
             console.log(Object.isExtensible(obj)) // false
             console.log(obj)  // {name:"zhangsan",sex:"nan"}
          }

7、密封对象

1、Object.seal:让一个对象密封,并返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可以修改已有属性的值的对象。
2、Object.isSealed:判断一个对象是否密封

function sealFun (){
            var obj = {name:"zhangsan"}
            console.log(Object.isSealed(obj))  // false
            //密封
            Object.seal(obj)
            console.log(Object.isSealed(obj)) // true
            // 不能添加属性
            obj.age = 22;
            console.log(obj.age) // undefined
            //删除属性
            delete obj.name;
            console.log(obj.name) // zhangsan
            //修改已经存在属性的值
            obj.name = "hani";
            console.log(obj.name) // hani
            //修改已有属性的可枚举性、可配置性、可写性
            Object.defineProperty(obj,"name",{//报错
                configurable: true,
                writable: true,
                enumerable: true 
            })

       }

8、冻结对象

1、Object.freeze:这个方法比 Object.seal 更绝,冻结对象是指那些不能添加新的属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性的对象。也就是说,这个对象永远是不可变的。
2、Object.isFrozen :判断对象是否冻结

function freezeFun (){
            var obj = {name:"zhangsan"}
            console.log(Object.isFrozen(obj))  // false
            //密封
            Object.freeze(obj)
            console.log(Object.isFrozen(obj)) // true
            // 不能添加属性
            obj.age = 22;
            console.log(obj.age) // undefined
            //删除属性
            delete obj.name;
            console.log(obj.name) // zhangsan
            //修改已经存在属性的值
            obj.name = "hani";
            console.log(obj.name) //zhangsan
            //修改已有属性的可枚举性、可配置性、可写性
            Object.defineProperty(obj,"name",{//报错
                configurable: true,
                writable: true,
                enumerable: true 
            })

       }

es6扩展

属性的简洁表示法:
A:es6允许在对象中直接写变量,属性名为变量名,属性值为变量值。

     function createFun(x,y){
             return {x,y}
      }
      console.log(createFun(1,2))  // {x:1,y:2}

B:属性名表达式:用表达式作为属性名,这时要将表达式放在方括号之内。

1、Object.assign(target, …sources):用于对象的合并,将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象

   const obj1 ={
      a: 1,
      b: 2,
      c: 3
   }
   const object2 = Object.assign({c: 4, d: 5}, object1);
   console.log(object2.c, object2.d); //  3,5

注意点

1、浅拷贝:如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用
2:同名属性的替换
3:数组的处理:assign可以用来处理数组,但是会把数组视为对象
4:取值函数的处理:assign只能进行值得复制,如果要复制的值是一个取值函数,那么将求职后在进行复制

用途

为对象添加属性

 class Point {
	  constructor(x, y) {
	    Object.assign(this, {x, y});
	  }
}

为对象添加方法

Object.assign(SomeClass.prototype, {
  someMethod(arg1, arg2) {
    ···
  },
  anotherMethod() {
    ···
  }
});
// 等同于下面的写法
SomeClass.prototype.someMethod = function (arg1, arg2) {
  ···
};
SomeClass.prototype.anotherMethod = function () {
  ···
};

克隆对象

  //克隆对象
  //将原始对象拷贝到一个空对象,就得到了原始对象的克隆,不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值
  function clone(origin) {
	  return Object.assign({}, origin);
  }
  //如果想要保持继承链,可以采用下面的代码。
  function clone(origin) {
  let originProto = Object.getPrototypeOf(origin);
  return Object.assign(Object.create(originProto), origin);
}

合并多个对象

2、Object.getOwnPropertyDescriptor():返回对象指定的属性配置
3、Object.getPrototypeOf():返回指定对象的原型对象。
4、Object.setPrototypeOf():设置对象的原型(即内部[[Prototype]]属性)
5、Object.is():比较两个值是否相同。所有 NaN 值都相等(这与=不同)

6、Object.keys()(es5),Object.values(),Object.entries()

1:Object.keys()(es5):返回一个由给定对象自身可枚举(enumerable=true )的属性名组成的数组
2:Object.values() (es6):返回一个由给定对象自身可枚举(enumerable=true )的属性值的数组
3:Object.entries()(es6):返回一个由给定对象自身可枚举(enumerable=true )属性的【key,value】数组

7、super 关键字:指向当前对象的原型对象,super关键字表示原型对象时,只能用在对象的方法之中,用在其他地方都会报错。

你可能感兴趣的:(es6,js,Object,ES6,ES5)