ES6新增Object方法

1. Object.create(proto,[propertiesObject])

描述:创建一个新对象,使用现有对象来提供新建对象的__proto__

参数:
  proto:新建对象的__proto__指向的原型对象
  [propertiesObject]:一个对象,该对象的属性类型参照Object.defineProperties()的第二个参数

返回值:一个新对象,带着指定的原型对象和属性。

var o;

// 创建一个原型为null的空对象
o = Object.create(null);


o = {};
// 以字面量方式创建的空对象就相当于:
o = Object.create(Object.prototype);


o = Object.create(Object.prototype, {
  // foo会成为所创建对象的数据属性
  foo: {
    writable:true,
    configurable:true,
    value: "hello"
  },
  // bar会成为所创建对象的访问器属性
  bar: {
    configurable: false,
    get: function() { return 10 },
    set: function(value) {
      console.log("Setting `o.bar` to", value);
    }
  }
});


function Constructor(){}
o = new Constructor();
// 上面的一句就相当于:
o = Object.create(Constructor.prototype);
// 当然,如果在Constructor函数中有一些初始化代码,Object.create不能执行那些代码


// 创建一个以另一个空对象为原型,且拥有一个属性p的对象
o = Object.create({}, { p: { value: 42 } })

// 省略了的属性特性默认为false,所以属性p是不可写,不可枚举,不可配置的:
o.p = 24
o.p
//42

o.q = 12
for (var prop in o) {
   console.log(prop)
}
//"q"

delete o.p
//false

//创建一个可写的,可枚举的,可配置的属性p
o2 = Object.create({}, {
  p: {
    value: 42,
    writable: true,
    enumerable: true,
    configurable: true
  }
});

2. Object.is(value1,value2)

描述:判断两个值是否相同
参数:两个要比较的值
返回值:一个布尔值

		都是undefined
		都是null
		都是true或false
		都是长度相同字符串且字符按相同顺序排列
		都是相同对象(相同的地址)
		都是数字且
			都是+0
			都是-0
			都是NaN(算数运算中只要分母为0就是NaN)
			都是Infinity
			都是非0且非NaN且为同一个值

与== 运算不同。 == 运算符在判断相等前对两边的变量(如果它们不是同一类型) 进行强制转换 (这种行为的结果会将 “” == false 判断为 true), 而 Object.is不会强制转换两边的值。

与=== 运算也不相同。 === 运算符 (也包括 == 运算符) 将数字 -0 和 +0 视为相等 ,而将Number.NaN 与NaN视为不相等.

3. Object.assign(target,…source)

描述:将所有可枚举的属性键值对从一个或者多个源对象中分配到目标对象
参数:
  target: 目标对象
  …source:其他对象
返回值:执行方法后的target
注:这个方法调用后会改变target本身,并且返回target

1.合并具有相同属性的对象会覆盖属性值
const o1 = { a: 1, b: 1, c: 1 };
const o2 = { b: 2, c: 2 };
const o3 = { c: 3 };

const obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }


2.继承属性不可复制
var obj = {'name':'lisi'};
var obj2 = {age:12};
Object.setPrototypeOf(obj,obj2);
console.log(obj.age);		//12
var obj3 = Object.assign({},obj);
console.log(obj3.age);		//undefined


3.不可枚举的属性不可复制
const obj = Object.create({foo: 1}, { // foo 是个继承属性。
    bar: {
        value: 2  // bar 是个不可枚举属性。
    },
    baz: {
        value: 3,
        enumerable: true  // baz 是个自身可枚举属性。
    }
});

const copy = Object.assign({}, obj);
console.log(copy); // { baz: 3 }


4.原始类型会被包装为对象
const v1 = "abc";
const v2 = true;
const v3 = 10;
const v4 = Symbol("foo")

const obj = Object.assign({}, v1, null, v2, undefined, v3, v4);
// 原始类型会被包装,null 和 undefined 会被忽略。
// 注意,只有字符串的包装对象才可能有自身可枚举属性。
console.log(obj); // { "0": "a", "1": "b", "2": "c" }


5.assign是浅拷贝,当源对象中有引用类型的属性值时,复制的是引用地址
let obj1 = {a:0 , b:{c:0}}
let obj2 = Object.assign({},obj1);
console.log(obj2);  //{ a: 0, b: { c: 0 } }

obj1.a = 1;
console.log(obj1);  //{ a: 1, b: { c: 0 } }
console.log(obj2);  //{ a: 0, b: { c: 0 } }

obj2.a = 2;
console.log(obj1);  //{ a: 1, b: { c: 0 } }
console.log(obj2);  //{ a: 2, b: { c: 0 } }

obj2.b.c = 3;
console.log(obj1);  //{ a: 1, b: { c: 3 } }
console.log(obj2);  //{ a: 2, b: { c: 3 } }

// Deep Clone
obj1 = { a: 0 , b: { c: 0}};
let obj3 = JSON.parse(JSON.stringify(obj1));
obj1.a = 4;
obj1.b.c = 4;
console.log(JSON.stringify(obj3));	// { a: 0, b: { c: 0}}

4. Object.setPrototypeOf(obj,prototype)

描述:设置对象的__proto__指向的原型对象,让obj继承prototype

参数:
  obj:要设置的目标对象
  prototype:该对象的新原型(一个对象 或 null).

返回值:这个对象obj本身

5. Object.getPrototypeOf(object)

描述:获取对象的原型对象

参数:
object:指定对象

返回值:给定对象的原型。如果没有继承属性,则返回 null 。

JavaScript中的 Object 是构造函数(创建对象的包装器)。
一般用法是:
var obj = new Object();

所以:
Object.getPrototypeOf( Object );               // ƒ () { [native code] }
Object.getPrototypeOf( Function );             // ƒ () { [native code] }

Object.getPrototypeOf( Object ) === Function.prototype;        // true

Object.getPrototypeOf( Object )是把Object这一构造函数看作对象,
返回的当然是函数对象的原型,也就是 Function.prototype。

正确的方法是,Object.prototype是构造出来的对象的原型。
var obj = new Object();
Object.prototype === Object.getPrototypeOf( obj );              // true

Object.prototype === Object.getPrototypeOf( {} );               // true

6.Object.keys(obj)

返回值:一个由一个给定对象的自身可枚举属性组成的字符串数组。不包括继承的属性

7.Object.values(obj)

返回值:一个包含对象自身的所有可枚举属性值的数组。不包括继承的属性

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值