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 相关文章推荐
基于jQuery图片平滑连续滚动插件
Apr 27 Javascript
JavaScript 学习笔记 Black.Caffeine 09.11.28
Nov 30 Javascript
JS判断数组中是否有重复值得三种实用方法
Aug 16 Javascript
jQuery菜单插件superfish使用指南
Apr 21 Javascript
jQuery插件Timelinr 实现时间轴特效
Oct 04 Javascript
js流动式效果显示当前系统时间
May 16 Javascript
js 弹出虚拟键盘修改密码的简单实例
Oct 10 Javascript
JS实现全屏的四种写法
Dec 30 Javascript
JS中的phototype详解
Feb 04 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
Feb 19 Javascript
详解vue的数据binding绑定原理
Apr 12 Javascript
详解微信小程序审核不通过的解决方法
Jan 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原生模板引擎 最简单的模板引擎
2012/04/25 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
详解php用static方法的原因
2018/09/12 PHP
Laravel自动生成UUID,从建表到使用详解
2019/10/24 PHP
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
jQuery.extend 函数的详细用法
2012/06/27 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
javascript的惯性运动实现代码实例
2019/09/07 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
python中import reload __import__的区别详解
2017/10/16 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
python实现杨氏矩阵查找
2019/03/02 Python
Python中BeautifuSoup库的用法使用详解
2019/11/15 Python
酒店服务实习自我鉴定
2013/09/22 职场文书
社团招新策划书
2014/02/04 职场文书
违纪检讨书2000字
2014/02/08 职场文书
优秀高中生事迹材料
2014/02/11 职场文书
实习生岗位职责
2014/04/12 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
财务年终工作总结大全
2019/06/20 职场文书
教你利用Selenium+python自动化来解决pip使用异常
2021/05/20 Python
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python
Log4j.properties配置及其使用
2021/08/02 Java/Android
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android