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 相关文章推荐
基于JQuery的浮动DIV显示提示信息并自动隐藏
Feb 11 Javascript
JQuery扩展插件Validate 2通过参数设置验证规则
Sep 05 Javascript
Javascript 中的 call 和 apply使用介绍
Feb 22 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
Aug 13 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
Sep 05 Javascript
对于this和$(this)的个人理解
Sep 08 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
Dec 26 Javascript
AngularJS教程 ng-style 指令简单示例
Aug 03 Javascript
Bootstrap路径导航与分页学习使用
Feb 08 Javascript
Javascript防止图片拉伸的自适应处理方法
Dec 26 Javascript
Vuepress 搭建带评论功能的静态博客的实现
Feb 17 Javascript
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
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木马攻击防御之道
2008/03/24 PHP
javascript中关于执行环境的杂谈
2011/08/14 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
快速处理vue渲染前的显示问题
2018/03/05 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
原生JavaScript实现的无缝滚动功能详解
2020/01/17 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
ES6 Generator基本使用方法示例
2020/06/06 Javascript
vue.js 解决v-model让select默认选中不生效的问题
2020/07/28 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
Python实现的质因式分解算法示例
2018/05/03 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
Python 转换文本编码实现解析
2019/08/27 Python
Django 自定义分页器的实现代码
2019/11/24 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
pytorch中图像的数据格式实例
2020/02/11 Python
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
药学专业大专生的自我评价
2013/12/12 职场文书
教师个人自我评价范文
2014/04/13 职场文书
投标服务承诺书
2014/05/28 职场文书
小学课外活动总结
2014/07/09 职场文书
党委班子对照检查材料
2014/08/19 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
初一年级组工作总结
2015/08/12 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript