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 正则替换 replace(regExp, function)用法
May 22 Javascript
javascript 拷贝节点cloneNode()使用介绍
Apr 03 Javascript
一个JavaScript的求爱小特效
May 09 Javascript
JavaScript笔记之数据属性和存储器属性
Mar 31 Javascript
Vue.js实现无限加载与分页功能开发
Nov 03 Javascript
基于Vue2的移动端开发环境搭建详解
Nov 03 Javascript
微信小程序 地图(map)实例详解
Nov 16 Javascript
vue项目部署到Apache服务器中遇到的问题解决
Aug 24 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
Apr 11 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
Jul 25 Javascript
JS实现电脑虚拟键盘的操作
Jun 24 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
Aug 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
PHP 验证码的实现代码
2011/07/17 PHP
PHP使用Pear发送邮件(Windows环境)
2016/01/05 PHP
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
js实现兼容IE6与IE7的DIV高度
2010/05/13 Javascript
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
Js获取事件对象代码
2010/08/05 Javascript
chrome原生方法之数组
2011/11/30 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
vue mint-ui学习笔记之picker的使用
2017/10/11 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
微信小程序之导航滑块视图容器功能的实现代码(简单两步)
2020/06/19 Javascript
Python的函数的一些高阶特性
2015/04/27 Python
python定时检查某个进程是否已经关闭的方法
2015/05/20 Python
Python多线程和队列操作实例
2015/06/21 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
Python使用random.shuffle()打乱列表顺序的方法
2018/11/08 Python
记一次python 内存泄漏问题及解决过程
2018/11/29 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
python求加权平均值的实例(附纯python写法)
2019/08/22 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
YOOX台湾:意大利奢侈品电商
2018/10/13 全球购物
比利时家具购买网站:Home24
2019/01/03 全球购物
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
2014年预备党员群众路线教育实践活动对照检查材料思想汇报
2014/10/02 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
销售人员管理制度
2015/08/06 职场文书
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL