一、new是什么
new命令的作用,就是执行构造函数,返回一个实例对象。
var Vehicle = function () {
this.price = 1000;
};
var v = new Vehicle();
v.price // 1000
从上面可以看到:
- 通过new命令,让构造函数Vehicle生成一个实例对象,保存在变量v中
- new命令执行时,构造函数内部的this,就代表了新生成的实例对象
- this.price表示实例对象有一个price属性,值是1000
使用new命令时,根据需要,构造函数也可以接受参数。
function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype.sayName = function () {
console.log(this.name)
}
const person1 = new Person('Tom', 20)
console.log(person1) // Person {name: "Tom", age: 20}
t.sayName() // 'Tom'
从上面可以看到:
- new通过构造函数 Person 创建出来的实例可以访问到构造函数中的属性。
- new通过构造函数 Person 创建出来的实例可以访问到构造函数原型链中的属性。
二、new命令的原理
使用new命令时,他后面的函数依次执行下面的步骤。
- 创建一个空对象,作为将要返回的对象实例。
- 将这个对象的原型,指向构造函数的prototype属性。
- 将这个空对象赋值给函数内部的this关键字。
- 开始执行构造函数内部的代码。
流程图如下:
三、手写实现new
function mynew(func,...args){
const obj = {}; // 1.创建一个空对象
obj.__proto__ = func.prototype; // 2.将这个空对象的原型指向Person.prototype
let result = func.apply(obj,args); // 3. 将构造函数的this指向新对象,执行内部代码
return result instanceof Object ? result: obj; // 4.根据返回值判断
}
测试一下:
function mynew(func, ...args) {
const obj = {};
obj.__proto__ = func.prototype;
let result = func.apply(obj, args);
return result instanceof Object ? result : obj;
}
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.say = function () {
console.log(this.name)
}
let p = mynew(Person, "kobe", 18)
console.log(p) // Person {name: "kobe", age: 18}
p.say() // kobe
本文就这么多了,谢谢!