Js New一个函数和直接调用的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Js New一个函数和直接调用的区别相关的知识,希望对你有一定的参考价值。
个人觉得主要是过程不同:
一个是构造对象、一个是函数调用。
function b()this.p = 1;
this.p1 = 2;
var a = new b();
a.p // 1
a.p1 //2
var c = b();
c.p // 报错
c.p1 // 报错
new:
实际上a的__proto__成员指向了b对象prototype成员对象,然后b函数对象的this指针替换成a,然后再调用b函数(),这时候的a里面的this变成了a自己,所以a拥有p和p1
a.__proto__=b.prototype;b.call(a)
function b()
a.p = 1;
a.p1 = 2;
参考技术A 直接使用的上下文是window(也就是this),new会使执行该函数的上下文指向这个函数本身。
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函数与直接调用函数产生的结果等同,但是是两个不同的过程,一个是构造对象、一个是函数调用。
以上是关于Js New一个函数和直接调用的区别的主要内容,如果未能解决你的问题,请参考以下文章
javascript调用一个函数(对象),new和直接调用的区别