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 相关文章推荐
Prototype源码浅析 String部分(四)之补充
Jan 16 Javascript
如何判断鼠标是否在DIV的区域内
Nov 13 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
JS与jQuery实现隔行变色的方法
Sep 09 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
Jul 17 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
Mar 14 Javascript
vue中关闭eslint的方法分析
Aug 04 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
Oct 15 Javascript
vue封装一个简单的div框选时间的组件的方法
Jan 06 Javascript
vue请求数据的三种方式
Mar 04 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
Aug 07 Javascript
解决Antd Table组件表头不对齐的问题
Oct 27 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
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
redis 队列操作的例子(php)
2012/04/12 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
php 7新特性之类型申明详解
2017/06/06 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
php框架CodeIgniter主从数据库配置方法分析
2018/05/25 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
JavaScript面向对象编程
2008/03/02 Javascript
JavaScript打字小游戏代码
2011/12/26 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
Python中文竖排显示的方法
2015/07/28 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
在PyCharm导航区中打开多个Project的关闭方法
2019/01/17 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
澳大利亚最早和最古老的巨型游戏专家:Yardgames
2020/02/20 全球购物
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
医药代表个人求职信范本
2013/12/19 职场文书
《春天来了》教学反思
2014/04/07 职场文书
教室标语大全
2014/06/21 职场文书
综合实践活动报告
2015/02/05 职场文书
子女赡养老人协议书
2016/03/23 职场文书
交互式可视化js库gojs使用介绍及技巧
2022/02/18 Javascript