前言
本系列主要整理前端面试中需要掌握的知识点。本节介绍Object.create和new的区别以及Object.create的实现。
一、Object.create和new的区别
Object.create能够创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。 --MDN
new创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
举例说明,清晰明了:
function A() {
this.name = 'abc';
}
A.prototype.a = 'a';
A.prototype.showName = function () {
return this.name;
}
var a1 = new A();
var a2 = Object.create(A);
console.log('new方法:');
console.log(a1);
console.log('create方法:');
console.log(a2);
按照定义来看,new创建了一个实例,这个实例就是用户定义的对象类型,create应该是创建了一个对象,这个对象的原型是A。
按照结果来看,new创建的实例中既有对象A原本的属性,也包括原型上的属性;create创建的对象的原型为对象A,但是没有里面的属性,同样有原型上的属性。
二、Object.create的使用
语法:Object.create(proto, [propertiesObject])
;
参数:
①proto:传递一个现在有的对象,即新对象的原型对象(新创建的对象_proto_属性指向现有属性)。第一个参数proto的值为null,那么创建出来的对象是一个{}(空对象)并且没有原型;
②propertiesObject:可选,给新对象添加新属性以及描述器。如果没有指定即创建一个{},有原型也有继承Object.prototype上的方法。
可以通过Object.create(null) 创建一个干净的对象,也就是没有原型
三、Object.create的实现
new的实现可以看【前端知识之JS】JS中new关键字的具体操作
function mycreate(obj){
// 创建一个对象
function F(){}
// 使用现有的对象来提供新创建的对象的__proto__
F.prototype = obj
// 返回F的实例
return new F()
}