JavaScript中使用构造器创建对象无需new的情况说明


Posted in Javascript onMarch 01, 2012

如下

function Person(name, age) { 
this.name = name; 
this.age = age; 
} 
var p = new Person('lily', 20);

发现某些库代码中创建正则对象的方式无需new,这让人感到奇怪。如下

var reg = RegExp('^he$');

测试发现使用或不使用new,最后返回的都是正则对象,且typeof它们都是“object”。

var reg1 = new RegExp('^he$'); 
var reg2 = RegExp('^he$'); 
reg1.test('he'); // true 
reg2.test('he'); // true 
console.log(typeof reg1); // object 
console.log(typeof reg2); // object

嗯,挺好,代码运行正常。
如果这样的话干脆就不写new了,这么还节省了代码量。其它类型也是这样吗?试试String/Number/Boolean。

var str1 = new String(1); 
var str2 = String(1); 
var num1 = new Number('1'); 
var num2 = Number('1'); 
var boo1 = new Boolean(1); 
var boo2 = Boolean(1); 
console.log(typeof str1); // object 
console.log(typeof str2); // string 
console.log(typeof num1); // object 
console.log(typeof num2); // number 
console.log(typeof boo1); // object 
console.log(typeof boo2); // boolean

可以看到,与正则的情况不同。正则无论是否new,typeof后都是object。
但String/Number/Boolean类型,new的对象typeof返回是“object”,不new的typeof返回则是“string”。
即不适用new的情况可以将其它类型分别转化成字符串,数字和布尔类型。

好了,再回到篇头的那个Person类。即我们自己写的类可以不用new操作符生成对象吗?

function Person(name, age) { 
this.name = name; 
this.age = age; 
} 
var p = Person('lily', 20); 
console.log(p); // undefined

返回undefined,很明显不行。因此想不用new的情况去创建Person实例是异想天开的。
如果非要实现呢?其实也行,如下

function Person(name, age) { 
this.name = name; 
this.age = age; 
if (this===window) { 
return new Person(name, age); 
} 
} 
var p = Person('lily', 20); // object

稍微改造了下Person类。实际上内部区分了下Person是作为构造器还是函数执行。

Javascript 相关文章推荐
控制打印时页眉角的代码
Feb 08 Javascript
jsTree树控件(基于jQuery, 超强悍)[推荐]
Sep 01 Javascript
javascript在事件监听方面的兼容性小结
Apr 07 Javascript
js图片向右一张张滚动效果实例代码
Nov 23 Javascript
jQuery获得子元素个数的方法
Apr 14 Javascript
浅谈Javascript数组的使用
Jul 29 Javascript
详解使用vue-admin-template的优化历程
May 20 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
Sep 15 Javascript
vue.draggable实现表格拖拽排序效果
Dec 01 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
Dec 12 Javascript
JavaScript中使用Spread运算符的八种方法总结
Jun 18 Javascript
Javascript Symbol原理及使用方法解析
Oct 22 Javascript
JavaScript中的变量声明早于赋值分析
Mar 01 #Javascript
JavaScript中函数声明优先于变量声明的实例分析
Mar 01 #Javascript
Jquery提交表单 Form.js官方插件介绍
Mar 01 #Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
Mar 01 #Javascript
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
Mar 01 #Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
Mar 01 #Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
Mar 01 #Javascript
You might like
第十二节 类的自动加载 [12]
2006/10/09 PHP
phalcon框架使用指南
2016/02/23 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
PHP中危险的file_put_contents函数详解
2017/11/04 PHP
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
使用js简单实现了tree树菜单
2013/11/20 Javascript
javaScript如何生成xmlhttp
2013/12/16 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
简介BootStrap model弹出框的使用
2016/04/27 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
2016/07/24 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python操作xml文件示例
2014/04/07 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
Python将多份excel表格整理成一份表格
2018/01/03 Python
python和pygame实现简单俄罗斯方块游戏
2021/02/19 Python
python函数的作用域及关键字详解
2019/08/20 Python
python使用socket 先读取长度,在读取报文内容示例
2019/09/26 Python
Python测试Kafka集群(pykafka)实例
2019/12/23 Python
全面介绍python中很常用的单元测试框架unitest
2020/12/14 Python
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
2020/11/16 HTML / CSS
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
大学生自荐书范文
2013/12/10 职场文书
新闻专业学生的自我评价
2014/02/13 职场文书
主题教育活动总结
2014/05/05 职场文书
文明班级建设方案
2014/05/15 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
高中美术教学反思
2016/02/17 职场文书
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang