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
functionDemo1(a){this.a=areturn'test'}Demo1.prototype.getA=function(){return'a is :'+this.a}constinst1=newDemo1(5)inst1.getA()
显示返回一个对象:
functionDemo2(a){this.a=areturn{b:3}}Demo2.prototype.getB=function(){return'a is :'+this.b}constinst2=newDemo2(5)inst2.a//undefinedinst2.b//2inst2.getB()// inst2.getB is not a function 显示返回的对象不是Demo2的实例,不能访问原型上的对象。
function_new(constructFunc, ...rest){letobj={}obj.__proto__=constructFunc.prototypeletres=constructFunc.apply(obj,rest)return(res&&typeofres==='object') ? res : obj}functionTest(a){this.a=areturn{b:a}}Test.prototype.getA=function(){returnthis.a}consttestInst=_new(Test,999)testInst.getA()// testInst.getA is not a function 不是实例
new关键字干了什么?
通常使用
new
关键字是为了创建一个自定义对象类型的实例。使用new的时候,会有以下几个过程:以上仅仅是new的过程,如果要创建一个用户自定类型的对象,需要以下两部:
有两点值得注意:
1、如果构造函数没有显示的返回一个对象,则返回this(创建的实例对象)。 如果显示返回一个对象,则返回该对象,且该对象不是构造函数的实例。 如果返回 null string number等,会直接忽略,继续返回this对象。测试一下:
怎么模拟一个new ?
先实现一个简单的版本。
注意:定义新对象的时候,以下两种方法是等价的:
如果使用
Object.create(null)
创建对象,则会丢失原型,只能通过Object.setPrototypeOf()
重新设置对象的原型。o.__proto__
设置是无效的。处理异常返回
这里要做一次判断,如果constructFunc函数返回一个对象,则直接返回该对象,否则就返回构造的实例对象。
参考文章:mqyqingfeng/Blog#13
new.target
new.target
是es6新增的指令, 返回new调用的函数的函数名。基于该指令可以辅助实现限制部分函数必须用new调用。比如定义了一个构造函数,必须先实例化才能继续使用。可以写以下函数来容错。以上写法,不管有没有使用new来调用函数,都可以返回一个Person的实例。增加程序健壮性;
The text was updated successfully, but these errors were encountered: