博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解new和实现一个new
阅读量:5908 次
发布时间:2019-06-19

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

为啥要用new: 在javascript中, 通过new可以产生原对象的一个实例对象,而这个实例对象继承了原对象的属性和方法。

new操作符干了什么:

  1. 创建一个新对象。
  2. 新对象隐式原型链接到构造函数显式原型。
  3. 执行构造函数并将构造函数作用域指向新对象。
  4. 返回新对象。

new的过程中遇到的坑一:

我们看到:
new Function返回的是一个函数,
new Object返回的是一个对象,那么什么是普通对象什么是函数对象?

通过查找资料发现有这么一句话:凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。

new的过程中遇到的坑二:

我们看到new一个普通对象报错,new一个函数对象才可以,对于这个结果很好奇为什么?于是又查资料。

原型对象:

1).显式原型: 每个函数对象都有prototype属性,称为显式原型2).隐式原型: 每个普通对象都有_proto_属性,指向的是相对应的构造函数的prototype,称为隐式原型复制代码

是不是可以这么理解,new一个普通对象,因为只有函数对象才有prototype属性,所以普通对象无法通new来创建一个新对象。只有通过函数对象来用new创建一个新的普通对象。

分析上面步骤的具体内容:

  1. new就是根据一个a(函数)对象创建了一个新的b(普通)对象。
  2. b属于普通对象,那么就有__proto__属性,普通对象的__proto__属性指向他的构造函数(函数对象)的prototype,所以a是b的构造函数,b是a的实例对象。
  3. 通过执行构造函数给b对象添加属性,构造函数的this指向b对象。

具体实现步骤:

function _new (fn) {        var obj = {            __proto__ : fn.prototype,        };        var res = fn.call(obj);        return Object.prototype.toString.call(res) === "[object Object]" ? res  : obj;    }复制代码

我们来运行一下代码:

可以看到我们实现了new操作符所干的事。 但是有这种情况:
var o3 = new fun ('tom');,而且如果构造函数包含好几个属性,在new的过程中,有可能会传入多个参数。 我们需要改造一下:

function _new (fn) {    return function () { // 返回一个函数,调用此函数时传入的参数达到new带参数的目的。        var obj = {            __proto__ : fn.prototype,        };        var res = fn.apply(obj, arguments);        return Object.prototype.toString.call(res) === "[object Object]" ? res  : obj;    }}复制代码

我们再来运行一下代码:

虽然没有像new那么简结,但是也算是实现了我们想要的。

当然使用闭包的方式会有内存泄漏的风险!所以我们还可以改造一下:

function _new () {	var fn = [].shift.call(arguments);	//var ags = [].prototype.slice.call(arguments, 1);    var obj = {        __proto__ : fn.prototype,    };    var res = fn.apply(obj, arguments);    return Object.prototype.toString.call(res) === "[object Object]" ? res  : obj;}复制代码

完美! 如果上面分析有误,请及时在评论区指正,谢谢。

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

你可能感兴趣的文章
WordPress新增Page的模版文件
查看>>
sql 子查询和连接查询
查看>>
WP移动设备压缩与解压控件Xceed Zip for .NET Compact Framework控件下载及详细介绍使用方法...
查看>>
proc文件系统探索 之 根目录下的文件[六]
查看>>
搭建ICINGA监控
查看>>
占用CPU时间,调用函数,点亮LED的C语言程序 【原创】
查看>>
DataSet
查看>>
ios滑动手势全屏(这段代码实现了下一级控制器滑到上一级控制器)
查看>>
第三方分享功能
查看>>
Quartz.NET 前一次任务未执行完成时不触发下次的解决方法
查看>>
设计模式(四)工厂方法模式
查看>>
BZOJ3144:[HNOI2013]切糕——题解
查看>>
1.IntelliJ IDEA搭建SpringBoot的小Demo
查看>>
TCP报文格式
查看>>
iOS - Bitcode App 瘦身中间码
查看>>
SQL中的null值
查看>>
datagridview 用法
查看>>
[转] 拉格朗日对偶
查看>>
python unittest之断言及示例
查看>>
online_judge_1106
查看>>