博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟实现构造函数new的过程 js
阅读量:4130 次
发布时间:2019-05-25

本文共 890 字,大约阅读时间需要 2 分钟。

用new操作符创建对象时发生的事情:

(1)创建一个新对象;

(2)将构造函数的作用域赋给新对象(因此this就指向了这个新对象);如spring.__ proto __ =  Student.prototype

(3)执行构造函数中的代码(为这个新对象添加属性和方法);

(4)返回新对象;

每个class都有显式原型 prototype;每个实例都有隐式原型 __proto__

通过new创建的对象和构造函数之间建立了一条原型链。原型链:当访问实例对象的属性和方法时,会先从自身构造函数中找,如果没有,就继续去 __proto__ 中查找。

function myNew(constructor, params) {    var obj = new Object();  //创建一个空的对象    var args = [].slice.call(arguments);  //将具有length属性的arguments转换为数组    var constructor = args.shift();  //删除并拿到arguments中第一个参数,即取出构造函数    obj.__proto__ = constructor.prototype;  //链接到原型,obj可以访问构造函数原型中的属性    var res = constructor.apply(obj, args);  //绑定this,实现继承,obj可以访问到构造函数中的属性    return (typeof res === 'object' && typeof res !== null) ? res : obj;  //优先返回构造函数返回的对象}

[].slice.call(arguments):能够将具有length属性的arguments转换为数组

slice(start, end) 方法:可提取数组的某个部分,并以新的数组返回被提取的部分。

使用start(包含) 和 end(不包含) 参数来指定提取数组开始和结束的部分

shift() 方法:删除数组第一项,并返回删除项。

转载地址:http://hnuvi.baihongyu.com/

你可能感兴趣的文章
在qt中使用QSplitter设置初始比例setStretchFactor失效的解决方法
查看>>
repeater的使用
查看>>
qt msvc编译中文乱码解决
查看>>
qt中TextField输入框无法输入中文解决办法
查看>>
qt实现点击出现窗口,点击其他任何地方窗口消失
查看>>
QML DropArea拖拉文件事件
查看>>
CORBA links
查看>>
读后感:>
查看>>
ideas about sharing software
查看>>
different aspects for software
查看>>
To do list
查看>>
Study of Source code
查看>>
如何使用BBC英语学习频道
查看>>
spring事务探索
查看>>
浅谈Spring声明式事务管理ThreadLocal和JDKProxy
查看>>
初识xsd
查看>>
java 设计模式-职责型模式
查看>>
构造型模式
查看>>
svn out of date 无法更新到最新版本
查看>>
java杂记
查看>>