new运算符定义是:
创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
1. 以下面代码为例:
function Car(name, model) {
this.name = name;
this.model = model;
}
const car1 = new Car('XXX', 'Talon TSi');
2. 描述
new 关键字会进行如下的操作:
1. 创建一个空对象 (即 o = {} )
2. 空对象原型上绑定构造函数的原型(即 o._proto = Car.prototype)
目的是为了继承 Car 原型上的内容 (在下面**图二**有代码演示)
3. 调用 Car() 函数,并把空对象 o 当做 this ( 即 Car.call(o) )
4. 如果该函数 return 引用类型 则返回此变量,如果 return 的是基本类型则返回 this
// 基本类型: 字符串、数字、布尔、空(null)、未定义(undefined)、Symbol。
// 引用类型: 对象(object)、数组(Array)、函数 (Function) 。
3. 结合 new运算符定义 如图1:
3.2 图二:
4. 实现new操作符
function Car(name, model) {
this.name = name;
this.model = model;
}
Car.prototype.move = function () {
console.log('小车出发啦!!!')
}
// const car1TomyNew = myNew(Car,'奔驰', 'Talon TSi' )
// 目的 car1TomyNew 得到的是=> {name: "奔驰", model: "Talon TSi"} 其中原型上也要有 move方法
// 创建car1TomyNew 方法 , ...args 为 ES6 剩余参数语法
function car1TomyNew (func, ...args) {
// 1. 第一步创建一个对象
let obj = {}
// 2. 继承函数的原型
o._proto_ = func.prototype
// 3. 调用函数并改变this的指向
/*
* 这里就要多记录几句:
* 改变this指向有
*/
let result = func.call(o)
result instancof Object ? return
}