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 相关文章推荐
解决表单中第一个非隐藏的元素获得焦点的一个方案
Oct 26 Javascript
jQuery 连续列表实现代码
Dec 21 Javascript
Javascript 中的类和闭包
Jan 08 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
May 06 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
Aug 23 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
Nov 15 Javascript
angularjs ocLazyLoad分步加载js文件实例
Jan 17 Javascript
js实现仿购物车加减效果
Mar 01 Javascript
js实现返回顶部效果
Mar 10 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
Feb 18 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
Jul 25 Javascript
AudioContext 实现音频可视化(web技术分享)
Feb 24 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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
PHP之预定义接口详解
2015/07/29 PHP
PHP中配置IIS7实现基本身份验证的方法
2015/09/24 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
jquery cookie实现的简单换肤功能适合小网站
2013/08/25 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
javascript常用函数(1)
2015/11/04 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
python编写微信远程控制电脑的程序
2018/01/05 Python
python远程连接MySQL数据库
2019/04/19 Python
基于python实现雪花算法过程详解
2019/11/16 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
python如何代码集体右移
2020/07/20 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
Python爬取某平台短视频的方法
2021/02/08 Python
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
护理专业毕业生自荐信范文
2014/01/05 职场文书
团党委领导干部党的群众路线教育实践活动个人对照检查材料思想汇
2014/10/05 职场文书
班主任高考寄语
2015/02/26 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js