这几天跟几个同事聊天发现他们对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修饰的函数头来了解一个函数到底是要干什么,所以函数构造者的必要注释是重要的。
相关推荐
javascript new后的constructor属性.docx
javascript new 需不需要继续使用.docx
JQ JS javascript new Data() 获取 指定日期 的 后一天
本文实例讲述了JavaScript new对象的四个过程。分享给大家供大家参考,具体如下: new对象: function Person(name, age) { this.name = name; this.age = age; } var person = new Person("Alice", 23); new一...
(1)创建一个新的对象,并让this指针指向它; (2)将函数的prototype对象的所有成员都赋给这个新对象; (3)执行函数体,对这个...} var nn=new BB(“cc”); //var nn={};BB.apply(nn) //nn=BB.prototype; alert
主要介绍了javascript new的运行机制的相关资料,需要的朋友可以参考下
js代码-Javascript New 的实现
本篇文章小编为大家介绍,Javascript new Date().valueOf()的作用与时间戳由来详解。需要的朋友参考下
javascript备课(new)
javascript 中,new一个对象的实质是什么?即,当我们构建一个类的实例的时候,真正做了些什么?
在javascript你不需要使用new Object(),你该使用{}就可以了。
var b=new BB();这时b是对象有了BB的的属性prototype所指向的prototype对象;prototype对象有constructor属性指向BB这个函数;所以alert(b.constructor==BB.prototype.constructor) //true 这里的“有了”的...
本人是Javascript菜鸟,下面是前几天学习Javascript的旅程心得,希望对和我一样的入门者有点用,也希望高手批评指正。