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 相关文章推荐
懒就要懒到底——鼠标自动点击(含时间判断)
Feb 20 Javascript
js实现运行代码需要刷新的解决方法
Aug 18 Javascript
jQuery的实现原理的模拟代码 -3 事件处理
Aug 03 Javascript
DOM 事件流详解
Jan 20 Javascript
微信小程序 wx.uploadFile无法上传解决办法
Dec 14 Javascript
简单实现AngularJS轮播图效果
Apr 10 Javascript
全站最详细的Vuex教程
Apr 13 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
Jun 25 Javascript
Node.js Buffer模块功能及常用方法实例分析
Jan 05 Javascript
vue实现动态显示与隐藏底部导航的方法分析
Feb 11 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
Feb 27 Javascript
详解vue中this.$emit()的返回值是什么
Apr 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安全编程之加密功能
2006/10/09 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
php正则修正符用法实例详解
2016/12/29 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
php 7新特性之类型申明详解
2017/06/06 PHP
jQuery实现摸拟alert提示框
2016/05/22 Javascript
AngularJS ng-controller 指令简单实例
2016/08/01 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
jQuery实现的简单动态添加、删除表格功能示例
2017/09/21 jQuery
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
inquirer.js一个用户与命令行交互的工具详解
2019/05/18 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
Vue是怎么渲染template内的标签内容的
2020/06/05 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
Python Mysql数据库操作 Perl操作Mysql数据库
2009/01/12 Python
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
Scrapy框架使用的基本知识
2018/10/21 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
Python中包的用法及安装
2020/02/11 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
BNKR中国官网:带你感受澳洲领先潮流时尚
2018/08/21 全球购物
MADE法国:提供原创设计师家具
2018/09/18 全球购物
校园招聘策划书
2014/01/09 职场文书
六查六看自查材料
2014/02/17 职场文书
《动手做做看》教学反思
2014/04/09 职场文书