new关键字的使用
class Cat {
constructor(name) {
this.name = name;
}
say() {
console.log("喵~");
}
}
const miniCat = new Cat("小花");
console.log(miniCat);
miniCat.say();
对使用结果进行分析
当我们通过const miniCat = new Cat("小花");时。我们可以发现什么。
1、首先最容易发现的是,new Cat("小花")会返回一个对象,我们用miniCat变量来接收这个返回值,
意味着new关键字会为我们返回一个对象。
2、那么对象是从哪来的?肯定不是我们传的,那就是new关键字为我们创建的对象。
3、我们发现miniCat对象身上有name属性,已知constructor中this.name = name;那么这个
this指向的就是这个返回出来的对象,new为我们将类中的this指向了这个对象。
4、我们可以调用say方法,但是我们看见miniCat对象身上没有say属性。那么我们判断是否是
在原型上,我们打印miniCat.__proto__查看是否有say方法。见下图可知,是有的,那么我们
可以知道,new将这个对象的原型链指向了类的原型链。
用es5构造函数来替代es6Class语法糖
通过前面分析我们知道了new关键字为我们做了四件事,es6的class就是一个语法糖,使用
语法糖并不利于我们理解原理。我们为刚才的案例编写es5版本的实现。
console.log("es5构造函数模拟class");
function Cat(name) {
this.name = name;
Cat.prototype.say = function() {
console.log("喵~");
};
}
const miniCat = new Cat("小花");
console.log(miniCat);
miniCat.say();
模拟实现new关键字
console.log("es5构造函数模拟class");
function Cat(name) {
this.name = name;
Cat.prototype.say = function() {
console.log("喵~");
};
}
function _new(fn, ...args) {
let obj = {};
obj.__proto__ = fn.prototype;
fn.call(obj, ...args);
return obj;
}
console.log("_new实现new")
const miniCat = _new(Cat, "小花");
console.log(miniCat);
miniCat.say();