You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。 ——(来自于MDN)
举个栗子
functionCar(color){this.color=color;}Car.prototype.start=function(){console.log(this.color+" car start");}varcar=newCar("black");car.color;// 访问构造函数里的属性// blackcar.start();// 访问原型里的属性// black car start
可以看出 new 创建的实例有以下 2 个特性
1、访问到构造函数里的属性
2、访问到原型里的属性
注意点
ES6新增 symbol 类型,不可以使用 new Symbol(),因为 symbol 是基本数据类型,每个从Symbol()返回的 symbol 值都是唯一的。
Number("123");// 123String(123);// "123"Boolean(123);// trueSymbol(123);// Symbol(123)newNumber("123");// Number {123}newString(123);// String {"123"}newBoolean(true);// Boolean {true}newSymbol(123);// Symbol is not a constructor
模拟实现
当代码 new Foo(...) 执行时,会发生以下事情:
一个继承自 Foo.prototype 的新对象被创建。
使用指定的参数调用构造函数 Foo ,并将 this 绑定到新创建的对象。new Foo 等同于 new Foo(),也就是没有指定参数列表,Foo 不带任何参数调用的情况。
由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。
模拟实现第一步
new 是关键词,不可以直接覆盖。这里使用 create 来模拟实现 new 的效果。
new 返回一个新对象,通过 obj.__proto__ = Con.prototype 继承构造函数的原型,同时通过 Con.apply(obj, arguments)调用父构造函数实现继承,获取构造函数上的属性(【进阶3-3期】)。
// 测试用例functionCar(color){this.color=color;}Car.prototype.start=function(){console.log(this.color+" car start");}varcar=create(Car,"black");car.color;// blackcar.start();// black car start
定义
举个栗子
可以看出
new
创建的实例有以下 2 个特性注意点
ES6新增
symbol
类型,不可以使用new Symbol()
,因为symbol
是基本数据类型,每个从Symbol()
返回的symbol
值都是唯一的。模拟实现
当代码
new Foo(...)
执行时,会发生以下事情:Foo.prototype
的新对象被创建。Foo
,并将this
绑定到新创建的对象。new Foo
等同于new Foo()
,也就是没有指定参数列表,Foo
不带任何参数调用的情况。new
表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。模拟实现第一步
new
是关键词,不可以直接覆盖。这里使用create
来模拟实现new
的效果。new
返回一个新对象,通过obj.__proto__ = Con.prototype
继承构造函数的原型,同时通过Con.apply(obj, arguments)
调用父构造函数实现继承,获取构造函数上的属性(【进阶3-3期】)。实现代码如下
测试一下
完美!
不熟悉
apply / call
的点击查看:【进阶3-3期】深度解析 call 和 apply 原理、使用场景及实现不熟悉继承的点击查看:JavaScript常用八种继承方案
模拟实现第二步
上面的代码已经实现了 80%,现在继续优化。
构造函数返回值有如下三种情况:
return
,即返回undefined
undefined
以外的基本类型情况1:返回一个对象
实例
car
中只能访问到返回对象中的属性。情况2:没有
return
,即返回undefined
实例
car
中只能访问到构造函数中的属性,和情况1完全相反。情况3:返回
undefined
以外的基本类型实例
car
中只能访问到构造函数中的属性,和情况1完全相反,结果相当于没有返回值。所以需要判断下返回的值是不是一个对象,如果是对象则返回这个对象,不然返回新创建的
obj
对象。所以实现代码如下:
【进阶3-4期】思考题解
问题:用 JS 实现一个无限累加的函数
add
,示例如下:实现:
我们知道打印函数时会自动调用
toString()
方法,函数add(a)
返回一个闭包sum(b)
,函数sum()
中累加计算a = a + b
,只需要重写sum.toString()
方法返回变量a
就OK了。参考
进阶系列目录
交流
进阶系列文章汇总如下,内有优质前端资料,觉得不错点个star。
https://github.com/yygmind/blog
我是木易杨,网易高级前端工程师,跟着我每周重点攻克一个前端面试重难点。接下来让我带你走进高级前端的世界,在进阶的路上,共勉!
The text was updated successfully, but these errors were encountered: