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 相关文章推荐
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
Mar 12 Javascript
jquery阻止冒泡事件使用模拟事件
Sep 06 Javascript
javascript实现滑动解锁功能
Dec 31 Javascript
高性能JavaScript模板引擎实现原理详解
Feb 05 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
Jan 20 Javascript
详解vue父子模版嵌套案例
Mar 04 Javascript
Angular 作用域scope的具体使用
Dec 11 Javascript
vue文件树组件使用详解
Mar 29 Javascript
javascript中一些奇葩的日期换算方法总结
Nov 14 Javascript
JS数组Object.keys()方法的使用示例
Jun 05 Javascript
使用Vant完成Dialog弹框案例
Nov 11 Javascript
详解基于element的区间选择组件校验(交易金额)
Jan 07 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
PHP 用数组降低程序的时间复杂度
2009/12/04 PHP
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
php实现简易计算器
2020/08/28 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
AngularJS中实现动画效果的方法
2016/07/28 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
Angular.js之作用域scope'@','=','&'实例详解
2017/02/28 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
wxPython框架类和面板类的使用实例
2014/09/28 Python
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
python逆序打印各位数字的方法
2018/06/25 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
基于打开pycharm有带图片md文件卡死问题的解决
2020/04/24 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
python中entry用法讲解
2020/12/04 Python
用C或者C++语言实现SOCKET通信
2015/02/24 面试题
应聘教师推荐信
2013/10/31 职场文书
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
自我鉴定三原则
2014/01/13 职场文书
社区七一党员活动方案
2014/01/25 职场文书
医科大学毕业生自荐信
2014/02/03 职场文书
企业出纳岗位职责
2014/03/12 职场文书
勾股定理课后反思
2014/04/26 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
教导主任个人总结
2015/03/03 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL