`

Javascript的new

阅读更多

       这几天跟几个同事聊天发现他们对javascript什么时候该用new都不是很了解,这和我上篇博文的new干了什么可以呼应吧。

       1、为什么javascript会这样,会导致很多人都不知道function什么时候该new什么时候不该new?

       2、到底什么时候该用new?

 

答:

1、javascript的function什么时候该new什么时候不该new?我觉得主要的问题还是集中在javascript的弱类型上面。首先我们知道new是干什么,是在创造对象。是的,不管是java还是.net。他是在创建一个对象,new的后面是什么,(java和.net)一般是被一个class修饰的类名称。那么javascript没有严格的类的概念,但其实他们的new也都是在创建对象。java和.net在new的时候都调用了构造函数,那么我们是不是可以认为javascript可以new的函数就称为构造函数吧。但是由于javascript是弱类型,他没有class修饰,没有是否有返回值修饰,只有一个function。所以一个function是否是构造函数很难通过函数头知道,而且既然他是弱类型,他们可以根据内部的条件选择到底是做构造函数用,还是做普通函数用。再加上我们很多程序员都是其他语言出身,很少有人系统的学习了javascript,所以就很混淆。

2、我觉得可以看看我前一篇博文,new到底干了什么。OK看下面这段代码结合说明一下。

	function Hello() {
		this.a = '123';
		this.b = function () {
			alert('b');
		}

		return this;
	}

	Hello.prototype.c = function() {
		alert('c');
	}
	var aHello = new Hello();
	var bHello = Hello();
	alert(aHello.a)
	alert(bHello.a)
	aHello.b();
	bHello.b();
	aHello.c();
	bHello.c();

 

你会发现bHello.c()是执行不了的。在看看上面的函数,他为什么既能new又能不new。你没有办法因为他是弱类型语言,我return this所以我既可以new也可以不new。从上可以看出function内部肯定是有个this这个空间的,然后就是看new干了什么,new就是在执行结束之后又把this.prototype = 函数.prototype(当然这个你是直接赋值不了的,原因自己了解吧)然后把this给了引用(不需要return),而不 new就是把this直接给了引用并没有 new的那个动作。所以bHello虽然也拿到了this(return this)但是没有拿到prototype(他的prototype是object这个有兴趣自己想想)。所以什么时候new还是不new要看看具体情况吧,首先你要去了解new干了什么,之后到底new不new就很容易理解了。因为javascript是弱类型语言你无法通过只有function修饰的函数头来了解一个函数到底是要干什么,所以函数构造者的必要注释是重要的。

      

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics