JavaScript中调用一个函数使用new关键字和直接调用的区别

        随着JavaScript的功能不止可以运行在客户端浏览器作为脚本,还是可以运行在服务器端的NodeJs,对于一个程序员,开发人员来说,不管是做前端,还是做后台,js的使用已经成为一个必备的能力,在此讨论一下js中调用一个函数使用new关键字和直接调用的区别,希望能带给新手一些帮助。也希望得到大神的指导。
一  构造器模式:
   先看一下代码:
function Person(name,age){
	this.name=name;
	this.age=age;
}
p1=Person('tom',20);
p2=new Person('mary',21);
console.log(p1);//undefined
console.log(p2);//Person {name: "mary", age: 21}
console.log(typeof p1);//undefined
console.log(typeof p2);//object

为什么会有以上差别呢?请看一下分析:
1.使用new则是将之当做构造函数来调用,会创建一个该类的实例对象,这个对象的type是这个函数名,中间使用this.propertyName=value会对该实例对象的属性赋值,并且无论有没有return,都会返回这个对象。

2.而如果是直接调用就是简单执行里面的代码,不会创建实例对象,this指向的调用环境下的this对象,如果是在全局中直接调用,就是window,没有默认返回值。

p1就是函数Person()执行的返回值,也就是undefined. 在函数执行过程中,属性被加到全局作用域或者Person方法所属的对象上了。执行以下代码,发现属性加在了window上:
console.log(window.name);//tom
console.log(window.age);//20

而p2是Person()的实例,Person {name: "mary", age: 21}

二  工厂模式:
   如果将Person函数构造为以下情况,结果会出现例外情况:
function Person(name,age){
    var obj = new Object();
	obj.name=name;
	obj.age=age;
    return obj;
}
p3=Person('jim',20);
console.log(p3);//Object {name: "jim", age: 20}
console.log(typeof p3);//object

这个就不需要加new,p3是一个Object,不是Person的实例。

Date();不加new返回当前时间,是一个字符串。加new的话,返回当前时间或者把参数格式化得到的时间,是一个Date对象。

String():不加new将参数格式化为字符串,加new则返回的是String对象。案例如下:
var str1=new String("abc");
var str2=String("abc");
console.log(str1);//String {0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"}
console.log(str2);//abc
console.log(typeof str1);//object
console.log(typeof str2);//string
str1.prop = 1;
console.log(str1.prop);//1
str2.prop = 1;
console.log(str2.prop);//undefined

Number类似于String。

总结以上内容有以下两点结论:
1. 直接调用函数的时候它叫“普通函数”,此时用全局对象window做上下文。
2. 用new关键字调用的时候它叫“构造函数”,此时用这个新生的对象做上下文。

限于个人能力,只能总结到这个程度,不喜勿喷!

猜你喜欢

转载自bri-robby.iteye.com/blog/2285901