Javascript 使用new 关键字调用函数和直接调用函数的区别

1.函数有返回值

$(function(){
function Person(name,age,job){
var o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayHi=function(){
console.log(this.name);
}
return o;
}
var people= new Person(‘xiaowang‘,24,‘developer‘);//new
people.sayHi();

var people1= Person(‘xiaowang‘,24,‘developer‘);
people1.sayHi();
});

验证得到,new关键字调用和直接调用的结果是一样的

Person函数创建了一个对象,并以相应的属性和方法初始化该对象,然后又返回了这个对象,除了使用new操作符且把使用的包装函数叫做构造函数之外,这个模式跟工厂模式是一模一样的。

2.如果函数没有返回值

$(function(){
function Person(name,age,job){
//var o=new Object();
this.name=name;
this.age=age;
this.job=job;
this.sayHi=function(){
console.log(this.name);
}
//return o;
}
var people= new Person(‘xiaowang‘,24,‘developer‘);//new
people.sayHi();

var people1= Person(‘xiaowang‘,24,‘developer‘);
people1.sayHi();
});

注意:构造函数在不返回值的情况下,默认返回新对象实例。

new 调用会正常工作,而直接调用会出错

3..如果返回值为函数

$(function(){

function Person(){
this.name=‘test‘;
return function(){return true};
}
var people= new Person();//构造对象
var people1= Person();//直接调用

console.log(people==people1);
console.log(people===people1);
});

虽然浏览器结果一样,但是比较结果都是false,因为javascript对object和function比较是基于引用类型的。

4.如果返回值为值类型(例如:number)

$(function(){
function Person(){
this.name=‘test‘;
return 2;//function(){return true};
}
var people= new Person();//构造对象
var people1= Person();//直接调用

console.log(people==people1);
console.log(people===people1);
});

比较结果发现结果都是false。

所以得出猜测

如果函数返回值为常规意义上的值类型(Number、String、Boolean)时,new 函数将会返回一个该函数的实例对象,而如果函数返回一个引用类型(Object、Array、Function),虽然new函数与直接调用函数产生的结果等同,但是是两个不同的过程,一个是构造对象、一个是函数调用。

时间: 2024-08-08 05:34:47

Javascript 使用new 关键字调用函数和直接调用函数的区别的相关文章

Js 使用new关键字调用函数和直接调用函数的区别

最近开始学习js,在看到书上的一个例子时,引发了我的一系列思考: 书上例子: function Person(name,age,job){ var o =new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return  o; } var friend=new Person("Nicholas",29,"Software Engineer&quo

Javascript 自动执行函数(立即调用函数)

开头:各种原因总结一下javascript中的自动执行函数(立即调用函数)的一些方法,正文如下 在Javascript中,任何function在执行的时候都会创建一个执行上下文,因为function声明变量和function有可能只在该function内部,这个上下文,在调用function的时候,提供一些简单的方式来创建自由变量或私有子function. eg: // 由于该function里返回了另外一个function,其中这个function可以访问自由变量i // 所有说,这个内部的f

JavaScript函数的各种调用模式

函数是JavaScript世界里的第一公民,换句话来说,就是我们如果可以精通JavaScript函数的使用,那么对JavaScript的运用可以更游刃有余了.熟悉JavaScript的人应该都知道,同样的函数,以不同的方式调用的话,受影响最大的应该是  this .下面我们来说说JavaScript函数的各种调用模式. 一.普通函数的调用模式 所谓普通函数的调用模式,也是JavaScript函数的最简单的一种调用模式,直接就是函数名后接一个  ()  实现调用,看下面代码: function f

JavaScript——函数定义和调用

1.定义函数 定义方式一 绝对值函数 function abs(x){ if(x>=0){ return x; }else{ return -x; } } 上述abs()函数的定义如下: function指出这是一个函数定义: abs是函数的名称: (x)括号内列出函数的参数,多个参数以,分隔: { ... }之间的代码是函数体,可以包含若干语句,甚至可以没有任何语句. 注意: 函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回.因此,函数内部通过条件判断和循环可以

Delphi 调用C/C++的Dll(stdcall关键字, 会导致函数名分裂. 此时函数名变成[email protected])

delphi调用C++写的Dll, 当然这个Dll要求是非MFC的Dll, 这样子才能被delphi调用. 根据C++定义函数的情况, Delphi有不同的相对应的处理方法.1. 声明中不加__stdcall,采用VC默认格式__cdecl,但在Delphi中要注明调用格式为cdecl.C++中例子: [cpp] view plain copy print? extern "C" int __declspec(dllexport) add(int x, int y); Delphi中例

JavaScript 函数定义和调用

普通的函数定义方法: function abs(x):{ if (x >= 0){ return x; }else { return -x ; } } 两种方法是等价的 var abs = function (x):{ if (x >= 0){ return x; }else { return -x ; }; arguments JavaScript还有一个免费赠送的关键字arguments,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数.arguments类似Array但它

JavaScript的函数的调用以及作为值的函数

一.函数的调用 1.通过其他的元素事件进行触发 <script type="text/javascript"> function box() { //没有参数的函数 alert('只有函数被调用,我才会被之执行'); } </script> <body> <input type="button" value="点我" onclick="box()"/> </body>

C#代码与JAVASCRIPT函数的相互调用

问:1.如何在JavaScript访问C#函数?2.如何在JavaScript访问C#变量?3.如何在C#中访问JavaScript的已有变量?4.如何在C#中访问JavaScript函数? 问题1答案如下:javaScript函数中执行C#代码中的函数:方法一:1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中;        2.在前台写一个js函数,内容为document.getElementById("btn1").click();        3.

javascript、jQuery函数定义和调用方法

一.javascript 1.var aaa=function(){...} var 方式定义的函数,不能先调用函数,后声明,只能先声明函数,然后调用. 2.function aaa(){...} function方式定义函数可以先调用,后声明. 例子: <script language="JavaScript" type="text/javascript"> //aaa();这样调用就会出错 var aaa = function(){ alert(&q