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 相关文章推荐
解析使用js判断只能输入数字、字母等验证的方法(总结)
May 14 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
Aug 21 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
Jun 20 Javascript
jquery插件NProgress.js制作网页加载进度条
Jun 05 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
Jun 17 Javascript
JavaScript每天必学之事件
Sep 18 Javascript
基于JavaScript实现带缩略图的轮播效果
Jan 12 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
Sep 19 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
Apr 20 Javascript
vue导出html、word和pdf的实现代码
Jul 31 Javascript
JavaScript 判断iPhone X Series机型的方法
Jan 28 Javascript
小程序自定义圆形进度条
Nov 17 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
PHP模拟SQL Server的两个日期处理函数
2006/10/09 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
2011/07/03 PHP
PHP运行模式的深入理解
2013/06/03 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
laravel 解决多库下的DB::transaction()事务失效问题
2019/10/21 PHP
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
超级给力的JavaScript的React框架入门教程
2015/07/02 Javascript
js实现简单的验证码
2015/12/25 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
javascript输出AscII码扩展集中的字符方法
2016/12/26 Javascript
详解vue-router基本使用
2017/04/18 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
2020/05/22 jQuery
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
Topshop法国官网:英国快速时尚品牌
2018/04/08 全球购物
实习销售业务员自我鉴定
2013/09/21 职场文书
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
聘任书模板
2014/03/29 职场文书
白莲教口号
2014/06/18 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers