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 相关文章推荐
JavaScript更改class和id的方法
Oct 10 Javascript
javascript模拟枚举的简单实例
Mar 06 Javascript
jQuery 3.0 的变化及使用方法
Feb 01 Javascript
自动完成的搜索框javascript实现
Feb 26 Javascript
关于Javascript中defer和async的区别总结
Sep 20 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
Sep 05 Javascript
详解React native全局变量的使用(跨组件的通信)
Sep 07 Javascript
vue配置文件实现代理v2版本的方法
Jun 21 Javascript
JavaScript函数Call、Apply原理实例解析
Feb 17 Javascript
夯基础之手撕javascript继承详解
Nov 09 Javascript
Vue如何循环提取对象数组中的值
Nov 18 Vue.js
详解JavaScript中Arguments对象用途
Aug 30 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/05/07 PHP
php实现自定义中奖项数和概率的抽奖函数示例
2017/05/26 PHP
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
正则表达式优化JSON字符串的技巧
2015/12/24 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
Angular2学习笔记——详解路由器模型(Router)
2016/12/02 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
2017/01/08 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
2019/11/06 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
Python文档生成工具pydoc使用介绍
2015/06/02 Python
Python连接DB2数据库
2016/08/27 Python
python操作 hbase 数据的方法
2016/12/18 Python
python实现图片筛选程序
2018/10/24 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
pytorch方法测试——激活函数(ReLU)详解
2020/01/15 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
2020/02/23 Python
python能开发游戏吗
2020/06/11 Python
python实现文件分片上传的接口自动化
2020/11/19 Python
大学生职业生涯规划书模板
2014/01/18 职场文书
企业承诺书格式
2014/05/21 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
新闻稿件写作技巧
2015/07/18 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
2016年中学清明节活动总结
2016/04/01 职场文书
2019事业单位个人工作总结范文
2019/08/26 职场文书
css样式important规则的正确使用方式
2022/06/10 HTML / CSS