`
zhouyrt
  • 浏览: 1162616 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

判断函数是new还是()调用

 
阅读更多

具名函数的各种调用方式 在一年前已经总结过了。

这篇看看如何判断一个函数是被new调用的,还是被其它方式调用的。

 

方式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调用”,显然不对
 

呃,还有更好的方法吗?

 

 

分享到:
评论
6 楼 dojotoolkit 2011-01-25  
无解。
new的作用提供一个Person.prototype的复制,以此为基础来调用Person()方法。
假设Person里什么都没做。
new Person()出来的p和复制出来的obj没有任何区别。所以在这2个上面调用constructor,也就是Person函数,没有区别。
5 楼 goldduck 2011-01-25  
不明白应用场景,为嘛要知道?
4 楼 cuixiping 2011-01-24  
可以判断的,情况分支比较多。

你看我blog里的这篇吧:

“函数中判断自己是以怎样的形式被调用的”
http://blog.csdn.net/cuixiping/archive/2011/01/24/6160456.aspx

3 楼 zhouyrt 2011-01-20  
to houfeng0923:

new Person(); 时就不行了。

谢谢你,但似乎无解。
2 楼 houfeng0923 2011-01-20  
补充:

if((this instanceof Person)&&this.name===undefined){
	alert('这是new调用');
 }else{
	alert('这是普通函数调用');
}

 this.name = n;
 this.age = a;
	

1 楼 houfeng0923 2011-01-20  

不是很清楚这样的用意,但你可以这样试试:

if((this instanceof Person)&&!this.name){
	alert('这是new调用');
 }else{
	alert('这是普通函数调用');
}

 this.name = n;
 this.age = a;
	

相关推荐

    JavaScript中判断函数是new还是()调用的区别说明

    在JavaScript中,判断函数是通过new运算符创建实例的方式调用,还是通过普通函数调用,通常涉及到几种不同的方法和它们的局限性。下面将详细介绍每种判断方式及其适用场景和潜在问题。 首先,为了区分new调用和普通...

    【Android 11】【Bluetooth模块】Bluetooth打开函数调用流程图

    在 BluetoothService.java 中,构造函数中 new 了 BluetoothManagerService 类的实例,并在 onStart 方法中进行了服务的初始化。该服务的开启是 Android 11 中蓝牙模块的核心组件。 二、BluetoothEnabler 的开关...

    [removed]new 一个函数和直接调用函数的区别分析

    由于构造函数的行为可以被函数内部的返回语句所改变,所以开发者需要根据具体函数的设计来判断调用时是否使用new关键字,以及可能得到的结果。 总结来说,当我们使用new关键字调用一个函数时,如果函数内部没有返回...

    C# 如何调用VB6.0编写的dll (1).doc

    在 VB6.0 编写的 DLL 中,我们定义了一个名为 `jia` 的函数,该函数接受三个整数参数 `a`、`b` 和 `c`,并返回一个布尔值。如果三个参数都满足某个条件,我们就返回 `True`,否则返回 `False`。 ```vb Public ...

    linux中添加系统调用

    系统调用是一种特殊的子程序,由操作系统内核提供,用户程序通过特定的接口(通常在C语言中是`syscall()`函数)调用。当执行系统调用时,处理器会切换到内核模式,执行相应的内核代码,然后返回到用户模式,确保了...

    visual studio调用python.doc

    而嵌入式开发主要采用Qt平台实现,因此实现跨平台函数调用是实现算法跨平台调用的关键。 知识点1: Visual Studio中的Python环境配置 在Visual Studio中,需要配置Python环境,以便在C++程序中调用Python函数。...

    标准库中函数对应的头文件

    C++中提供了多种字符串和字符处理函数,例如`isalpha`、`islower`、`ispunct`、`isspace`、`isupper`等,用于判断字符的属性。对应的头文件是`<cctype>`。 三、算法和迭代器 C++标准库提供了大量的算法函数,例如`...

    C#使用Twain调用扫描仪

    通常会有一个回调函数来处理扫描完成后的图像数据。 ```csharp twain.AcquireAsync((image) => { // 在这里处理扫描到的图像 }); ``` 5. **保存和处理图像**:扫描完成后,图像数据通常会被转换为Bitmap对象,你...

    javascript 构造函数强制调用经验总结

    因此,在使用上述方法来强制构造函数的new调用时,需要考虑未来的兼容性问题。 此外,作者还提及了jQuery库中的$函数,它在创建jQuery对象时也没有使用new关键字。jQuery内部实现了自己的new操作符功能,使得在不...

    详解微信小程序的不同函数调用的几种方法

    在微信小程序开发中,函数调用是实现各个功能的关键,本文将详细介绍几种常见的函数调用方法,帮助开发者更好地理解和运用。 一、调取参数直接调用 在同一个JS文件内部,可以直接调用定义的函数。例如,我们有一个`...

    powerbuilder(pb6-12)发送json到web应用服务器函数及其调用源码,可以直接导入项目调用,异步发送

    `sample.txt`可能是示例的输入数据或使用说明,用户可以通过阅读此文件了解如何准备JSON数据和调用函数。而`.srf`文件是PowerBuilder的资源文件,可能包含了函数的用户界面元素或相关设置,这些资源可以被Power...

    C#调用WINDOWS API函数,修改系统时间

    在编程领域,有时我们需要超越语言本身的功能,利用操作系统提供的服务,这时就需要调用操作系统的API(Application Programming Interface)函数。本文将深入探讨如何在C#中调用Windows API函数,特别是针对修改...

    构造函数不能声明为虚函数,析构函数可以声明为虚函数

    在构造函数被执行时,对象尚未完成构建,因此编译器无法判断对象是否属于当前类或其派生类。如果构造函数是虚函数,则需要动态绑定,而这依赖于对象的动态类型。但在构造过程中,对象的动态类型尚未确定,导致无法...

    安卓调用第三方导航高德、百度、腾讯,以及经纬度转换,判断应用是否存在

    在Android开发中,调用第三方地图导航应用如高德、百度和...以上就是关于在Android中调用第三方导航应用、坐标转换以及判断应用是否存在的详细知识点。在实际开发中,这些操作都需要结合具体的业务需求进行调整和优化。

    判断闰年-new.docx

    3. 调用函数或方法,传入年份进行判断。 4. 根据函数或方法的返回结果,输出相应的信息。 通过以上分析,我们可以看到,虽然C语言和Java语言的语法有所不同,但解决同一个问题的基本思路是一致的。它们都利用了条件...

    C++ QT调用外部程序(QProcess)

    QProcess *process = new QProcess(this); process->start("/path/to/external/app", {"arg1", "arg2"}); ``` 在上述代码中,`/path/to/external/app`是你想要调用的外部程序,而`"arg1"`和`"arg2"`是传递给该程序...

    Unity3d C# 虚函数 例子

    在编译期,虚函数并不会被静态编译,而是在运行期根据对象实例来动态判断要调用的函数。 在调用虚函数时,系统会首先检查对象的申明类,看是否有该虚函数的声明,如果有,那么它就不会立刻执行该函数,而是转去检查...

    公式解析类(字符串公式,自定义函数公式)

    2. **比较运算**: 支持大于、小于、等于、不等于等逻辑判断。 3. **内置函数**: 提供了一系列常用的数学函数如最大值、最小值等。 4. **自定义函数**: 允许用户自定义函数来扩展类的功能。 #### 实现原理与关键代码...

    C++ 函数实验.pdf

    C++函数实验旨在深入理解和掌握C++中的函数概念和应用,包括定义、声明、参数传递、函数嵌套、递归调用以及不同类型的变量。以下是根据实验内容详细讲解的知识点: 1. **定义函数**:函数是C++中模块化编程的基础,...

Global site tag (gtag.js) - Google Analytics