new
new详解
一、实例化
形式1:构造函数(ES5)
function Person(name) {
this.name = name
}
Person.prototype.sayHi = function() {
console.log('hi,', this.name)
}
let p = new Person('rory');
p.sayHi(); // hi, rory
console.log(p.__proto__ === Person.prototype); // true形式2:类(ES6)
class Person {
constructor(name) {
this.name = name;
}
sayHi() {
console.log('hi,', this.name)
}
}
let p = new Person('rory');
p.sayHi(); // hi, rory
console.log(p.__proto__ === Person.prototype); // true二、构造函数实例化过程:
声明一个空对象
改变原型:将空对象的原型(__proto__)指向构造函数的原型对象(prototype)
改变this:将构造函数的this指向空对象
返回结果:判断构造函数执行结果是否是对象,是则直接返回执行结果,否则返回声明的那个空对象
三、手动实现new:
验证:构造函数有返回值的情况
四、new.target
检测函数或构造方法是否是通过new运算符被调用的
普通的函数调用:new -> undefined
有new的构造函数调用:new -> 构造函数名
输出:
undefined
Foo
参考:
Last updated