Javascript函数深入研究:函数中判断自己是以哪种形式被调用的,是A(),还是new A()或者其它?

原创 2011年01月24日 06:57:00

假设有一个函数A是这样的:

function A(){  }

可能的调用方式有:

new A();

A();

A.a=A; A.a();

A.prototype.b=A; b=new A(); b.b();

A.prototype.c=A; A.prototype.c();

d=new A(); d.d=A; d.d();

A.apply(new A());

A.call(new A());

A.apply(A);

A.call(A);

等。

本文通过一个比较全面的示例,展示如何在函数定义中对各种情形进行判断。

需要指出的是,有些情况是等效的,运行时无法进行区分。

主要用到的特性有:callee, constructor, hasOwnProperty, instanceof, prototype

 

直接查看在线演示,请狠狠点击这里

 

演示截图:

function-how-I-was-called

 

先看看我的示例文档的输出结果:

function Person(n,a){
    //......
}

 

Person();
1.上面是普通函数调用



Person.prototype.aa = Person;
var p = new Person();
2.上面是new Person() 调用
p.aa();
3.上面是 原型方法aa 调用
Person.prototype.aa();
4.上面是“Person.prototype.***”调用


Person.call(document);
5.上面是普通函数调用
Person.call(Person);
6.上面是普通函数调用
Person.call(p);
7.上面是 原型方法aa 调用


Person.prototype = { };
var p = new Person();
8.上面是new Person() 调用
p.aa = Person;
p.aa();
9.上面是 扩展属性aa 调用


Person.prototype = {aa:Person};
var p = new Person();
10.上面是new Person() 调用
p.aa();
11.上面是 原型方法aa★★ 调用
Person.prototype.aa();
12.上面是“Person.prototype.***”调用▲▲▲


var p = new Person();
13.上面是new Person() 调用
p.fn = Person;
p.haha = Person;
p.fn();
14.上面可能是 原型方法bb★★原型方法aa★★扩展属性fn扩展属性haha 调用


Person.hello = Person;
Person.hello();
15.上面是普通函数调用
Person.hello.hello.hello.hello.hello.hello.hello.hello.hello();
16.上面是普通函数调用
new Person.hello();
17.上面是new Person() 调用
new Person.hello.hello.hello.hello.hello.hello.hello.hello.hello();
18.上面是new Person() 调用


eval(Person.toString().replace('Person','B'));
new B();
19.上面是new B() 调用

///

源代码:

Js New一个函数和直接调用的区别

事情的起因:首先我要说的是上一篇博客中我写到的一句话: 如果使用new关键字调用,那么函数的 return 语句不再起作用,因为这时还回的是 this 对象。博客发表以后,有网友评论中提到,当使用工厂...
  • hy6688_
  • hy6688_
  • 2014年03月29日 01:11
  • 27850

函数实现判断素数并调用函数输出100以内所有素数

/** * 文件名称:2012-4.cpp * 作 者: 胡颖 * 完成日期:2017 年 3月 13 日 * 输入描述:输入整数m * 问题描述:判断整数m是否为素数,调用函数输出...
  • huying1144
  • huying1144
  • 2017年03月13日 17:05
  • 2542

js new一个函数和直接调用函数的区别

用new和调用一个函数的区别:如果函数返回值是一个值类型(Number、String、Boolen)时,new函数将会返回这个函数的实例对象,而如果这个函数的返回值是一个引用类型(Object、Arr...
  • sunny327
  • sunny327
  • 2015年08月21日 14:24
  • 2971

Js new一个函数和直接调用函数的区别

个人对js函数的理解
  • zchdjb
  • zchdjb
  • 2016年11月04日 20:09
  • 843

多态:如何判断一个成员函数是否为虚函数(即函数的重写或覆盖)

判断一个成员函数是不是虚函数(重写),有两个三个条件: 两个成员函数各自在基类和派生类中定义; 基类中定义的成员函数必须带有关键字virtual,派生类的成员函数可带可不带。 这两个成员函数原型(函数...
  • lxp_mujinhuakai
  • lxp_mujinhuakai
  • 2017年04月06日 18:36
  • 321

javascript:if中可以使用那些作为判断条件

在所有编程语言中if是最长用的判断之一,但在js中到底哪些东西可以在if中式作为判断表达式呢? 例如如何几行,只是少了一个括号,真假就完全不同,到底表示什么含义呢 var obj={}; ...
  • vv354123
  • vv354123
  • 2014年12月12日 16:31
  • 1863

深入浅出ClassLoader, 你真的了解ClassLoader吗?

http://ifeve.com/classloader/ Dedicate to Molly. 你真的了解ClassLoader吗? 这篇文章翻译自zeroturnar...
  • liangxw1
  • liangxw1
  • 2016年05月09日 15:49
  • 3626

js Boolean函数和相等操作符规则

Boolean函数在不同的参数下的返回值: 数据类型 转换为true的值 转换为false Boolean true false String 非空字符串 “”(空字符串) N...
  • zhangwx6
  • zhangwx6
  • 2017年03月01日 22:56
  • 682

javascript的执行函数的四种方式

javascript的函数调用和构造函数调用函数调用、方法调用以及构造函数调用1 函数调用Function绝对是JavaScript中的重中之重。在JavaScript中,Function承担了pro...
  • sunshine940326
  • sunshine940326
  • 2016年08月16日 16:28
  • 2269

js判断是否是数字——isNaN()函数

isNaN  返回一个 Boolean 值,指明提供的值是否是保留值 NaN (不是数字)。   NaN 即 Not a Number   isNaN(numValue)   必选项 numv...
  • sanyuesan0000
  • sanyuesan0000
  • 2014年07月01日 14:03
  • 57170
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Javascript函数深入研究:函数中判断自己是以哪种形式被调用的,是A(),还是new A()或者其它?
举报原因:
原因补充:

(最多只允许输入30个字)