前言
在前端的面试中,有一道经典的题: 在new对象的过程中发生了什么
在javascript中, 我们总是称用于创建对象的函数为构造函数。 其实,没有构造函数,只有函数的构造调用,构造函数名称的首字母大写只是一种标识,并没有任何实际作用
code
const proto = {
sayHello() {
console.log(`名字: ${this.name}; 年龄: ${this.age}`)
}
}
function Person() {
const _this = this
const proEqual = Reflect.getPrototypeOf(this) === proto
this.name = 'zhangsan'
this.age = 18
}
Person.prototype = proto
const zhangsan = new Person()
执行结果如下
从执行结果可以看出: 在进入函数之前, new关键创建了一个空对象,并把空对象的原型关联到构造函数的原型上
而函数只是起到了把属性加入到对象中
函数返回值的影响
- 当返回值为引用类型时
引用类型会代替new的对象
- 当返回值为基本类型时
返回值是new关键字生成的对象
以上有兴趣的可以自行尝试
总结
由此我们可以得出结论
new: 初始化对象, 设定对象的原型, 过滤构造函数的返回值,返回过滤后的值
函数: 为对象添加属性或方法