标题: 【上海校区】【理解 new 运算符】 [打印本页] 作者: 没名字i 时间: 2018-12-21 01:01 标题: 【上海校区】【理解 new 运算符】 本帖最后由 上海分校-小影 于 2018-12-21 11:24 编辑
实例化 Person 过程中,Person返回什么(或者 p 等于什么)?
function Person(name) {
this.name = name
return name;
}
let p = new Person('Tom');
复制代码说实话,第一反应我以为值为 'Tom',等到我把代码丢到控制台一输出,才明白我错了。天呐,new运算符给无视掉了吗???
撇开 new 的存在,我们修改下代码
function Person(name) {
this.name = name
return name;
}
let p = Person('Tom');
console.log(p);
复制代码很显然,输出的结果是 'Tom', 但是有 new 存在呢?接下去,我们来捋一捋。
首先,我先去 MDN上搜索了 new 的定义
一起来理解下 new 到底做了什么工作吧~
就拿下面这个 demo分析
function Person(name) {
this.name = name;
return {a: 1}
}
var p = new Person('fefeng')
复制代码当调用 new Person(...)时,会进行以下几步:
首先是 继承自 Person.prototype的新对象会被创建
使用参数 'fefeng' 调用构造函数 Person, 并将 this 绑定到新创建的对象
由 Person 返回的对象就是 new 表达式的结果 =》 Person 返回的对象是 {a: 1} 所以new 表达式的结果为 {a:1} ; 如果 Person 没有返回值(一般构造函数都不返回值)那么使用步骤1创建的对象,即==》 继承自 Person.prototype 的新对象
貌似照着文档能够些许理解了,倘若模拟实现 new运算符更能深入理解 new
以下是 new 的模拟实现,代码来源 : JavaScript深入之new的模拟实现
function objectFactory() {
var obj = new Object(),
cons = [].shift.call(arguments)
obj.__proto__ = cons.prototype
var ret = cons.apply(obj, arguments)
return typeof ret === 'object' ? ret|| obj : obj
}
function Person(name) {
this.name = name;
return {a: 1}
}
var p = objectFactory(Person, 'fefeng')
复制代码当然了,学习别人的代码不能仅仅只是照搬过来,起码得理解这个代码吧。
使用