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 相关文章推荐
javascript编程起步(第四课)
Feb 27 Javascript
jQuery 学习第六课 实现一个Ajax的TreeView
May 17 Javascript
jQuery函数map()和each()介绍及异同点分析
Nov 08 Javascript
九种原生js动画效果
Nov 11 Javascript
SpringMVC+bootstrap table实例详解
Jun 02 Javascript
php简单数据库操作类的封装
Jun 08 Javascript
webpack实现热更新(实施同步刷新)
Jul 28 Javascript
JavaScript闭包的简单应用
Sep 01 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
Nov 22 Javascript
vue-cli 首屏加载优化问题
Nov 06 Javascript
js实现百度登录窗口拖拽效果
Mar 19 Javascript
JavaScript Blob对象原理及用法详解
Oct 14 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 批量更新网页内容实现代码
2010/01/05 PHP
php 求质素(素数) 的实现代码
2011/04/12 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
2019/10/17 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
javascript时间函数基础介绍
2013/03/28 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
2013/06/24 Javascript
jQuery处理xml格式的返回数据(实例解析)
2013/11/28 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
Vue中 key keep-alive的实现原理
2018/09/18 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
numpy.linspace函数具体使用详解
2019/05/27 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
学python需要去培训机构吗
2020/07/01 Python
使用Python封装excel操作指南
2021/01/29 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
家长对孩子的寒假评语
2015/10/09 职场文书
一道JS算法面试题——冒泡、选择排序
2021/04/21 Javascript
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL