JavaScript中判断函数是new还是()调用的区别说明


Posted in Javascript onApril 07, 2011

方式1

function Person(n,a){ 
this.name = n; 
this.age = a; 
if(this instanceof Person){ 
alert('new调用'); 
}else{ 
alert('函数调用'); 
} 
} 
var p = new Person('jack',30); // --> new调用 
Person(); // --> 函数调用

方式2
function Person(n,a){ 
this.name = n; 
this.age = a; 
if(this instanceof arguments.callee){ 
alert('new调用'); 
}else{ 
alert('函数调用'); 
} 
} 
var p = new Person('jack',30); // --> new调用 
Person(); // --> 函数调用

方式3
function Person(n,a){ 
this.name = n; 
this.age = a; 
if(this.constructor === arguments.callee){ 
alert('new调用'); 
}else{ 
alert('函数调用'); 
} 
} 
var p = new Person('jack',30); // --> new调用 
Person(); // --> 函数调用

看似很完美,但当把函数/类作为自身实例对象的方法时调用就出问题了
function Person(n,a){ 
this.name = n; 
this.age = a; 
if(this.constructor === arguments.callee){ 
alert('new调用'); 
}else{ 
alert('函数调用'); 
} 
} 
var p = new Person('jack',30); // 先new一个对象 
p.fn = Person; // 把函数/类 Person 赋值给自身对象p的fn属性 
p.fn(); // 这句调用时提示“这是new调用”,显然不对

还有更好的方法吗?
Javascript 相关文章推荐
向fckeditor编辑器插入指定代码的方法
May 25 Javascript
javascript实现上传图片并预览的效果实现代码
Apr 11 Javascript
JS数组array元素的添加和删除方法代码实例
Jun 01 Javascript
简介alert()与console.log()的不同
Aug 26 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
Jan 10 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
May 09 Javascript
vue-router权限控制(简单方式)
Oct 29 Javascript
深入理解 JS 垃圾回收
Jun 03 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
Jun 21 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
Nov 24 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
Jul 24 Javascript
原生JavaScript实现贪吃蛇游戏
Nov 04 Javascript
JavaScript中清空数组的三种方法分享
Apr 07 #Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
Apr 07 #Javascript
javascript各浏览器中option元素的表现差异
Apr 07 #Javascript
IE6/7/8中Option元素未设value时Select将获取空字符串
Apr 07 #Javascript
我的javascript 函数链之演变
Apr 07 #Javascript
JavaScript中链式调用之研习
Apr 07 #Javascript
js中各浏览器中鼠标按键值的差异
Apr 07 #Javascript
You might like
Yii实现自动加载类地图的方法
2015/04/01 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
thinkphp微信开发(消息加密解密)
2015/12/02 PHP
zen cart实现订单中增加paypal中预留电话的方法
2016/07/12 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
2019/10/12 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
json数据与字符串的相互转化示例
2013/09/18 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
jqueryMobile使用示例分享
2016/01/12 Javascript
jQuery判断checkbox选中状态
2016/05/12 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
2017/02/20 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
Python爬虫实现模拟点击动态页面
2020/03/05 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
幼儿园中秋节活动方案
2014/02/06 职场文书
统计员岗位职责
2015/02/11 职场文书
转正申请报告格式
2015/05/15 职场文书
欠条样本
2015/07/03 职场文书
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python