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表单常用验证集合
Jan 16 Javascript
javascript 写类方式之八
Jul 05 Javascript
浅析ajax请求json数据并用js解析(示例分析)
Jul 13 Javascript
JavaScript中的apply和call函数详解
Jul 20 Javascript
JavaScript设置获取和设置属性的方法
Mar 04 Javascript
图解prototype、proto和constructor的三角关系
Jul 31 Javascript
jQuery纵向导航菜单效果实现方法
Dec 19 Javascript
Vue入门之数据绑定(小结)
Jan 08 Javascript
微信小程序用户信息encryptedData详解
Aug 24 Javascript
详解vue开发中调用微信jssdk的问题
Apr 16 Javascript
JavaScript实现五子棋游戏的方法详解
Jul 08 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
Dec 25 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同时支持GIF、png、JPEG
2006/10/09 PHP
解析PHP中的unset究竟会不会释放内存
2013/07/18 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
php获取微信openid方法总结
2019/10/10 PHP
Js 刷新框架页的代码
2010/04/13 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
jQuery实现的五子棋游戏实例
2015/06/13 Javascript
JavaScript中的prototype原型学习指南
2016/05/09 Javascript
NodeJS整合银联网关支付(DEMO)
2016/11/09 NodeJs
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
基于Angular中ng-controller父子级嵌套的相关属性详解
2018/10/08 Javascript
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
在Django中使用Sitemap的方法讲解
2015/07/22 Python
Python计算字符宽度的方法
2016/06/14 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
使用Python脚本zabbix自定义key监控oracle连接状态
2019/08/28 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
Python使用pyenv实现多环境管理
2021/02/05 Python
澳大利亚优质葡萄酒专家:Vintage Cellars
2019/01/08 全球购物
迟到检讨书400字
2014/01/13 职场文书
幼儿园大班教学反思
2014/02/10 职场文书
英语老师推荐信
2014/02/26 职场文书
洗发露广告词
2014/03/14 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
2015年药房工作总结
2015/04/25 职场文书
《生物入侵者》教学反思
2016/02/16 职场文书
导游词之峨眉山
2019/12/16 职场文书