要说new关键字,首先我们得先聊聊函数。
1.函数
函数说白了就是一段可以重复执行的代码块,只需要定义一次就可以多次使用。
函数又分为以下两种形式:
- 声明式函数:该函数的特点就是会将函数声明提升到该作用域最前面,只要在这作用域以内,无论位置前后都可以直接调用,这里提到的变量提升以后我会专门细说。
function fn() {
console.log('这是一个声明式函数')
}
- 函数表达式:这就相当于把函数名提到前面变成一个变量,右边变成一个匿名函数,调用的时候直接调用声明的变量名即可。值得注意的是,这种表达式会在预解析时进行变量提升,在该作用域值只有在函数赋值后才可以调用,否则会出现fn is not a function,如果使用es6及以上语法的话会默认设为严格模式,会直接报错。
let fn = function () {
console.log('这是函数表达式');
};
2.构造函数
定义:通过 new 函数名 来实例化对象的函数叫构造函数。构造函数与普通函数并没有太大差异,为了区分我们将函数名首字母大写的函数作为构造函数,主要作用就是构造函数通过new关键字创建对象为初始化的对象添加属性和方法。
function Fn (age,name) {
this.age = age;
this.name = name;
};
Fn.prototype.play = function () {
console.log(`${this.age}的${this.name}在玩泥巴`)
};
let fn = new Fn(20,'小李');
fn.play(); //20岁的小李在玩泥巴
new关键字
终于到我们今天的主角 new 了,通过上面我们也看到了 new关键字 就是为了实例化一个构造函数。那么 new 在实例化的过程中到底做了哪些事情呢?
let obj = new Obj() 在执行时主要会做以下四件事情:
- new会在内存中创建一个新的空对象 var obj= {}
- new 会让this指向这个新的对象 Obj.call(obj)
- new会返回这个新对象
- 将原型指向构造函数的prototype obj._ proto_ = Obj.prototype
好了,以上就是对new关键字的一些见解。