JavaScript基础面试题7--JavaScript中的 new操作符
1.new 是什么
在 Javasript
中 new
是创建对象时要使用的运算符。
new
关键字通过构造函数 Student
创建出来的实例可以访问到构造函数中的属性。
new
通过构造函数 Student
创建出来的实例可以访问到构造函数原型链上的方法(即实例与构造函数通过原型链连接了起来)。
function Student(name, age) {
this.name = name;
this.age = age;
}
Student.prototype.sayName = function () {
console.log(this.name);
}
const s1 = new Student('小明', 18);
console.log(s1); //{name: '小明', age: 18}
s1.sayName(); // 小明
假如在构建函数中显示加上返回值,并且返回值是一个原始类型,这个返回类型没有用。例:
function Student(name, age) {
this.name = name;
this.age = age;
// 添加返回原始类型
return 1;
}
Student.prototype.sayName = function () {
console.log(this.name);
}
const s1 = new Student('小明', 18);
console.log(s1); //{name: '小明', age: 18}
s1.sayName(); // 小明
2.new 的执行流程
- 创建一个新的
obj
; - 将对象与构建函数通过原型链链接起来;
- 将构建函数中的
this
绑定到新建的对象obj
上; - 根据构建函数返回类型判断,如果是原始值则被忽略,如果返回值是对象,需要正常处理。
function myNew(Func, ...args) {
// 创建一个新的空对象,并将其赋值给变量 obj
const obj = {}
// 将新创建的对象 obj 的原型链指向传入的构造函数 Func 的原型,实现继承
obj.__proto__ = Func.prototype
// 使用 apply 方法调用构造函数 Func,将 this 绑定到新创建的 obj 上,并传递所有参数 args
const result = Func.apply(obj, args)
// 检查构造函数执行的结果 result 是否是一个对象实例
// 如果是,则返回结果对象;如果不是,则返回新创建的空对象 obj
return result instanceof Object ? result : obj;
}