new 和 Object.create()区别
new
操作符创建一个对象的过程
- 创建一个对象obj
- 将obj连接到原型链上,即设置
obj.__proto__ = Constructor.prototype
- 绑定this指向,传参执行原型函数(参数应用到obj对象上)
- 判断执行结果,没有则返回obj
/* 手写方法 */
function myNew() {
/* 创建新对象 */
let obj = new Object();
/* 构造函数,取第一个传入的参数,arguments不是数组,不存在shift方法 */
let Constructor = [].shift.call(arguments);//Person
/* 原型链 */
obj.__proto__ = Constructor.prototype;/* obj->Person.prototype->Person */
/* 绑定this指向传值,获取返回值 */
let res = Constructor.apply(obj, arguments);//Person(name,age)
/* 若结果不是对象则返回obj */
return typeof res === 'object' ? res : obj;
}
Object.create
创建一个对象的过程
- 创造一个空构造函数
- 将空的构造函数prototype设为传入的prototype
- 返回实例
Object.create = function (prototype) {
var F = function () { };
F.prototype = prototype;
return new F();
};
举例:
function A(name) {
this.name = "AAA";
}
A.prototype.age = 18;
// new
let a1 = new A();
console.log(a1);//A { name: 'AAA' }
console.log(a1.age);//18
// Object.create
let a2 = Object.create(A.prototype);
console.log(a2);//A {}
console.log(a2.age);//18
从执行过程和例子可以看出,new
和Object.create
创建的的实例都具备prototype
的属性和参数,但是new
创建的实例执行了原来的构造函数A
使新对象具备了原构造函数A自身的属性
,而Object.create
先创建一个空构造函数F
,再进行new F()
操作,原构造函数A
的自身属性不被继承.