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 相关文章推荐
让焦点自动跳转
Jul 01 Javascript
基于JQuery的Select选择框的华丽变身
Aug 23 Javascript
js获取鼠标点击的位置实现思路及代码
May 09 Javascript
jQuery切换所有复选框选中状态的方法
Jul 02 Javascript
JS创建事件的三种方法(实例代码)
May 12 Javascript
jQuery 的 ready()的纯js替代方法
Nov 20 Javascript
Bootstrap table简单使用总结
Feb 15 Javascript
JavaScript原型继承_动力节点Java学院整理
Jun 30 Javascript
Vue-Router模式和钩子的用法
Feb 28 Javascript
Vue CLI3 开启gzip压缩文件的方式
Sep 30 Javascript
js实现漂亮的星空背景
Nov 01 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
Mar 31 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
基于mysql的论坛(4)
2006/10/09 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
php解析xml方法实例详解
2015/05/12 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
利用php的ob缓存机制实现页面静态化方法
2017/07/09 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
this[] 指的是什么内容 讨论
2007/03/24 Javascript
js option删除代码集合
2008/11/12 Javascript
jQuery 事件队列调整方法
2009/09/18 Javascript
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
javascript 实现键盘上下左右功能的小例子
2013/09/15 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
完美实现js选项卡切换效果(一)
2017/03/08 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
python sys.argv[]用法实例详解
2018/05/25 Python
python交互界面的退出方法
2019/02/16 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
全球最大的瓷器、水晶和银器零售商:Replacements
2020/06/15 全球购物
2014信息技术专业毕业生自我评价
2014/01/17 职场文书
企业后勤岗位职责
2014/02/28 职场文书
还款承诺书范本
2015/01/20 职场文书
团员个人年度总结
2015/02/26 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
暑假打工感想
2015/08/07 职场文书
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript