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 相关文章推荐
符合W3C网页标准的iframe标签的使用方法
Jul 19 Javascript
JavaScript表单常用验证集合
Jan 16 Javascript
基于JQuery的密码强度验证代码
Mar 01 Javascript
JavaScript也谈内存优化
Jun 06 Javascript
7个有用的jQuery代码片段分享
May 19 Javascript
在vue项目创建的后初始化首次使用stylus安装方法分享
Jan 25 Javascript
讲解vue-router之命名路由和命名视图
May 28 Javascript
浅谈Node.js 中间件模式
Jun 12 Javascript
Vue实现本地购物车功能
Dec 05 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
May 09 Javascript
深入了解JavaScript 的 WebAssembly
Jun 15 Javascript
vue 实现走马灯效果
Oct 28 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
2020最新CPU的性能排名
2020/04/02 数码科技
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
PHP array_reduce()函数的应用解析
2018/10/28 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
2019/06/05 PHP
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
Python设计模式之代理模式实例
2014/04/26 Python
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
2018/01/11 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
对python实现合并两个排序链表的方法详解
2019/01/23 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
南京软件公司的.net程序员笔试题
2014/08/31 面试题
北大研究生linux应用求职信
2013/10/29 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
办公室务虚会发言材料
2014/10/20 职场文书
贷款工资证明范本
2015/06/12 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers