使用隐藏的new来创建对象


Posted in Javascript onMarch 29, 2011

很多时候我们是这样写类,然后使用new创建对象的。

function Person(name,age){ 
this.name=name; 
this.age=age; 
} 
Person.prototype={ 
setName : function(n){this.name=n;}, 
getName : function(){return this.name;} 
} 
var p = new Person('jack',25);

改成这样的
function Person(name,age){ 
//条件改为(this==window)或(this==self)或(this.constructor!=Object) 
if(!this.setName){ 
return new Person(name,age); 
} 
this.name=name; 
this.age=age; 
} 
Person.prototype={ 
setName : function(n){this.name=n;}, 
getName : function(){return this.name;} 
} 
var p = Person('jack',25);

注意该类较最上面的写类方式中多了以下
if(!this.setName){ 
return new Person(name,age); 
}

好,创建类的实例(对象)方式也变成了如下
var p = Person('jack',25);

这种创建方式(函数调用)较上面的少了“new_”,new和空格,实际上是在类内部new了。而这样方式每次创建对象可以减少4个byte。
如果把类内部的if判断条件换成非prototype上的属性,如this.name。程序会提示出错:too much recursion
function Person(name,age){ 
if(!this.name){ 
return new Person(name,age); 
} 
this.name=name; 
this.age=age; 
} 
Person.prototype={ 
setName : function(n){this.name=n;}, 
getName : function(){return this.name;} 
} 
var p = Person('jack',25);
Javascript 相关文章推荐
jQuery获取css z-index在各种浏览器中的返回值
Sep 15 Javascript
JS实现多物体缓冲运动实例代码
Nov 29 Javascript
jquery中获得元素尺寸和坐标的方法整理
May 18 Javascript
JS实现的自定义右键菜单实例二则
Sep 01 Javascript
js实现简单的验证码
Dec 25 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
Jan 15 Javascript
Vue.js学习之计算属性
Jan 22 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
May 11 Javascript
浅谈关于axios和session的一些事
Jul 13 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
Oct 08 Javascript
解决iview打包时UglifyJs报错的问题
Mar 07 Javascript
详解Vue数据驱动原理
Nov 17 Javascript
myeclipse安装jQuery插件的方法
Mar 29 #Javascript
分享27款非常棒的jQuery 表单插件
Mar 28 #Javascript
基于jQuery的动态表格插件
Mar 28 #Javascript
模拟jQuery ajax服务器端与客户端通信的代码
Mar 28 #Javascript
原来Jquery.load的方法可以一直load下去
Mar 28 #Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
Mar 28 #Javascript
jquery向.ashx文件post中文乱码问题的解决方法
Mar 28 #Javascript
You might like
PHP生成带有雪花背景的验证码
2008/09/28 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
浅析javascript函数表达式
2016/02/10 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
JavaScript中变量提升与函数提升经典实例分析
2018/07/26 Javascript
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
python leetcode 字符串相乘实例详解
2018/09/03 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
python实现的Iou与Giou代码
2020/01/18 Python
利用Python脚本批量生成SQL语句
2020/03/04 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
编辑找工作求职信范文
2013/12/16 职场文书
大学四年的个人自我评价
2014/01/14 职场文书
高三体育教学反思
2014/01/29 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
个人党性锻炼总结
2015/03/05 职场文书
项目备案申请报告
2015/05/15 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
辞职离别感言
2015/08/04 职场文书
react antd实现动态增减表单
2021/06/03 Javascript
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python