1.Object.create
Object.create的语法:Object.create(proto, [ propertiesObject ]) ,创建一个对象,新创建的对象的prototype指向第一个参数,第二个参数是为新创建对象添加属性
- proto是原型对象
- propertiesObject是属性的配置
在详解Object.create之前,我们先回忆一下常用的创建对象的方法: 1.{},2.new Object();
1,2除了能不能传参数的区别外,基本没其它区别。 但是它们跟Object.create的区别可就大了,接下来我们分析下用new创建对象跟用Object.create的区别:
先了解下new一个对象都做了哪些操作:
- 创建一个新对象
- 将新对象的原型指向构造函数的原型
- 执行构造函数,绑定this
- 返回这个对象
例://new Person() //Person是一个构造函数
var obj=new Object()
obj.__proto__ = Person.prototype
var res = Person.call(obj)
return res instanceof Object ? res : obj
例://Object.create(Person)
var f = function() {}
f.prototype=Person
return nee f();
从上可以看出Object.create(Person)创建的对象,并没有去调用Person的构造函数,因此,此时创建的对象不会继承Person自身的属性
2.Object.keys(obj)
发方法主要用来枚举给定对象的key,如var a=[1,2,3], 枚举a的结果就是:["0", "1", "2"], 它与for in的区别在于,Object.keys不会遍历到该对象的原型链上去。
3.Object.assign(target,source1,source2,...)
该方法主要用于对象的合并,将源对象source的所有可枚举属性合并到目标对象target上,此方法只拷贝源对象的自身属性,不拷贝继承的属性。
该方法合并的操作是浅拷贝,并不是深拷贝,他只能对值进行复制。特别要注意的是,该方法处理数组时,会把数组当成对象来处理
Object.assign([1, 2, 3], [4, 5])
// 把数组当作对象来处理
//结果 [4, 5, 3]