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 面向对象编程基础 多态
Aug 21 Javascript
实现JavaScript中继承的三种方式
Oct 16 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
Jun 15 Javascript
Jquery树插件zTree用法入门教程
Feb 17 Javascript
javascript+html5实现仿flash滚动播放图片的方法
Apr 27 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
Apr 24 Javascript
vue不通过路由直接获取url中参数的方法示例
Aug 24 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
Feb 05 Javascript
一百行JS代码实现一个校验工具
Apr 30 Javascript
jQuery创建折叠式菜单
Jun 15 jQuery
详解基于Vue/React项目的移动端适配方案
Aug 23 Javascript
微信小程序前端promise封装代码实例
Aug 24 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效率,提高php性能的一些方法
2011/03/24 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
2013/04/12 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
2014/10/30 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
jquery实现动静态条形统计图
2015/08/17 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
js实现拖拽上传图片功能
2017/08/01 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
vue使用自定义icon图标的方法
2018/05/14 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
python线程锁(thread)学习示例
2013/12/04 Python
python练习程序批量修改文件名
2014/01/16 Python
Python判断对象是否相等及eq函数的讲解
2019/02/25 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
2020/03/20 Python
利用Python制作动态排名图的实现代码
2020/04/09 Python
Python能做什么
2020/06/02 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
css3绘制天猫logo实现代码
2012/11/06 HTML / CSS
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
华为的Java面试题
2014/03/07 面试题
结构工程研究生求职信
2013/10/13 职场文书
银行职员工作失误检讨书
2014/10/14 职场文书
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记