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
// examplefunctionFoo(name,age){this.name=name;this.age=age;this.sex='male';}Foo.prototype.brother="宇智波鼬";Foo.prototype.chat=function(){console.log('how are you? 鸣人');}varperson=newFoo('佐助',21);console.log(person.name);console.log(person.sex);console.log(person.brother);person.chat();// 佐助// male// 宇智波鼬// how are you? 鸣人
// examplefunctionFoo(name,age){this.name=name;this.age=age;this.sex='male';}Foo.prototype.brother="宇智波鼬";Foo.prototype.chat=function(){console.log('how are you? 鸣人');}varperson=copyNew(Foo,'佐助',21);console.log(person.name);console.log(person.sex);console.log(person.brother);person.chat();// 佐助// male// 宇智波鼬// how are you? 鸣人
functioncopyNew(){varobj=newObject();varconstructor=[].shift.call(arguments);obj.__proto__=constructor.prototype;varresult=constructor.apply(obj,arguments);returntypeofresult==='object' ? result : obj;}
先搞清楚new
首先,我们要知道,创建一个用户自定义对象需要两步:
通过此处引出了new的描述,new是干嘛的呢?引用MDN的一句话:
初看时可能会有点懵,我们可以对这段话修枝剪叶留下枝干: new运算符可以创建 对象实例 。(之后再通过new的运用,补全其枝叶。)
这句话就符合最开头说的创建一个用户自定义对象的第二步了。实际应用也是,new运算符经常是与一个函数结合使用。
来看个例子:
从这个例子中我们可以看出,:
MDN上帮我们总结的更清楚,当代码 new Foo(...) 执行时,会发生以下事情:
第一步
有了对new的认识后,咱们开始仿写。因为 new 是个关键字,没法像之前的call、bind那样子写方法覆盖。我们可以写个方法 copyNew()。
以上面例子为例,我们让
new Foo(xxx)
的效果等于copyNew(Foo, xxx)
就行。来第一步代码:
have a test:
第一步成功。
第二步
我们现在考虑下构造函数有返回值的情况。
1、假设构造函数的返回值是对象。
举个例子:
我们可以发现,构造函数Foo的person实例完全只能访问Foo返回的对象中的属性。
那构造函数的返回值不是对象呢? 我们试一个基本类型的值。
2、假设构造函数的返回值是基本类型的值
结果刚刚相反,相当于无返回值时的处理。
所以我们可以根据这两个例子的结果去完善最后的代码,根据这个思路:
最终代码:
参考:
The text was updated successfully, but these errors were encountered: