Object.assign
let obj = Object.assign(targetObj, …sourceObj)
作用:将一个或多个源对象自身的可枚举属性与目标对象的属性合并
返回值:合并后的目标对象
var obj1 = {name: 'zyp1'} var obj2 = {name: 'zyp2', age: 18} var obj3 = {name: 'zyp'} obj3 = Object.defineProperty(obj3, 'like', { value: 'reading' }) var obj4 = {} var obj = Object.assign(obj4, obj1, obj2, obj3) console.log(obj) //结果为{name: "zyp", age: 18} console.log(obj4) //结果也为{name: "zyp", age: 18}
这里还要提一下的是,用扩展运算符也可以实现对象的合并: var obj5 = {...obj1, ...obj2, ...obj3} console.log(obj5) //结果为{name: "zyp", age: 18}
Object.create
let obj = Object.create(protoObj, [propertiesObj])
作用:创建新对象,在创建新对象的同时定义其原型对象(protoObj)以及一些新的属性(propertiesObj,新属性构成的对象,可选)
返回值:创建的新对象
// new Object() 方式创建 var a = { rep : 'apple' } var b = new Object(a) console.log(b) // {rep: "apple"} console.log(b.__proto__) // {} console.log(b.rep) // {rep: "apple"} // Object.create() 方式创建 var a = { rep: 'apple' } var b = Object.create(a) console.log(b) // {} console.log(b.__proto__) // {rep: "apple"} console.log(b.rep) // {rep: "apple"}
function Person(name, age) { this.name = name; this.age = age; } Person.prortotype.sayName = function() { alert(this.name) } function Worker(name, age) { Person.call(this, name, age) } var worker = new Worker('zyp', 18) console.log(worker)
得到的worker对象结果如下图:
这个符合我们的预期,通过构造函数实现继承的子类实例不会继承父类的原型属性,因此父类的sayName方法并没有被子类对象继承。
//子类继承父类的原型属性 Worker.prototype = Object.create(Person.prototype) Worker.prototype.constructor = Worker
得到的结果如下:
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for…in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性)。

Object.values()
方法返回一个给定对象自己的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。
<script>
var obj = {
10: 'a',
1: 'b',
2: 'c'
};
console.log(Object.values(obj));
// ['b', 'c', 'a']
var obj1 = {
0: 'a',
1: 'b',
2: 'c'
};
console.log(Object.values(obj1));
// ['a', 'b', 'c']
</script>
人生很漫长,或许我只是你人生中微不足道的一小段,只是你人生中的惊鸿一瞥。
浙公网安备 33010602011771号