new的过程

纸飞机 发表于 2021/10/18 22:36:56 2021/10/18
【摘要】 函数调用时前面不加new就按普通函数来 执行。加new后对其进行了相应的变动, 按构造函数来执行。 new的具体过程如下: //例子:function Person(name,age) { this.userName = name; this.userAge = age;}var personl = new Person...

函数调用时前面不加new就按普通函数来 执行。加new后对其进行了相应的变动, 按构造函数来执行。

new的具体过程如下:


  
  1. //例子:
  2. function Person(name,age) {
  3. this.userName = name;
  4. this.userAge = age;
  5. }
  6. var personl = new Person('LULU',20)

1、创建一个新的空对象。(即实例对象)

obj = {}
 

2 、设 置 原 型 链

将新对象obj的 __proto__属性指向构造函数的prototype 对象。(即所有实例对象通过__proto__可 以访问原型对象。构造函数的原型被其所有实例对象共享。)

obj.__proto__= Person.prototype
 

3 、将构造函数的thi s改指向新对象ob j并 执行函数代码。

(即给实例对象设置属性 userName, userAge并赋值。)

var result = Person.apply(obj,['LULU',20])
 

4 、如果构造函数中没有人为返回一个对象 类型的值,则返回这个新对象obj。否则直 接返回那个对象类型值。(一般定义的构造 函数中不写返回值。)


  
  1. if (typeof(result) == 'object') {
  2. return result;
  3. }else{
  4. return obj;
  5. }

手动实现一个new操作,参数为构造函数 及其传参


  
  1. //构造函数
  2. function Person(name,age) {
  3. this.userName = name;
  4. this.userAge = age;
  5. }
  6. Person.prototype.sayAge = function(){
  7. console.log(this.userAge)
  8. }
  9. // new操作函数newFun
  10. function newFun() {
  11. var obj = {};
  12. Constructor = [].shift.call(arguments);
  13. obj.__proto__ = Constructor.prototype;
  14. var ret = Constructor.apply(obj, arguments);
  15. return typeof ret === 'object' ? ret: obj;
  16. };
  17. //调用 newFun
  18. var s1 = newFun(Person, 'xiaoyun',20);
  19. console.log(s1.userName) //xiaoyun
  20. console.log(s1.sayAge()) //20

备注:[].shift.call(arguments):删除并返回参数列表arguments中第一个参数,即获得构造函数。arguments剩余参数为构数传参。arguments是类数组,没有数组方法shift,可更改shift方法的this指向从而运用到 arguments 上。

文章来源: root181.blog.csdn.net,作者:前端纸飞机,版权归原作者所有,如需转载,请联系作者。

原文链接:root181.blog.csdn.net/article/details/119856668

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。