【新东网技术大咖带您走进JavaScript】微软为什么会三次败给JavaScript
发布时间: 2016-09-02 10:57:31
文/王龙翔 通信研发部
新东网自2001年成立以来,掌握大数据、云计算、通信、物联网及区块链等领先信息技术,拥有一支逾16年经验的强大IT团队。为沉淀企业技术实力,继续发挥行业优势,《东网快讯》特邀新东网技术大咖带您走进这些先进信息技术,揭秘新东网16年来的技术成果,每周五发布。
在开始我们的话题之前,我们首先来认识一下JavaScript。
1、 JavaScript是门脚本语言,同时也是一门具有面向对象特性的编程,语法扩展特性很灵活的设计语言。
2、 JavaScript有委托,有事件,有异常处理,对象模型也很丰富。虽然不能继承,不过对象都可以无限扩展,有无继承也没那么多的意义了。
3、 浏览器市场竞争日趋白热化,不管是IE9,FireFox X还是Chrome X,竞争的焦点都是速度,速度的核心自然是Script执行速度。
4、 从创立至今,微软从未被对手真正打败过,却三次败给了JavaScript,承认了JS在Web前端的独霸地位。第一次是微软在Asp.Net中忍痛抛弃了亲生孩子--VBScript,全面支持JS;第二次是匆忙发布Ajax Extensions系列组件;第三次VS2008中集成了JQuery和代码提示为标志,Asp.Net大有融入富客户端之趋势。
通过以上几点,相信大家都不相信JavaScript在这个行业里的重要性。下面我们来了解一下JavaScript的设计模式:
一、 工厂模式
虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。
下面我们来改变代码的写法试试:
函数createPerson()能够根据接受的参数来构建一个包含所有必要信息的Person对象。可以无数次的调用这个函数,而每次它都会返回一个包含三个属性一个方法的对象。
工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。我们接下来了解构造方法,把每次的参数进行在一个特定的属性内封装起来传递值可以吗?
二、 构造方法模式
在这个例子中,我们是否想起了javase里bean的构造方法呢?在这里Person()函数取代了createPerson函数。我们注意到,Person()中的代码除了与createPerson()中相同的部分外,还存在以下不同之处:
(1)没有显式的创建对象;
(2)直接将属性和方法赋予了this对象;
(3)没有return语句。
三、 原型模式
虽然可以通过对象实例访问保存在原型中的值,但却不能通过对象实例重写原型中的值。如果我们在实例中添加一个属性,而该属性与实例原型中的一个属性同名,那我们就在实例中创建该属性,该属性将会屏蔽原型中的属性。
四、 原型的动态性
以上代码先创建了Person的一个实例,并将其保存在person中,然后,下一条语句在Person.prototype中添加了一个方法sayHi().即使person实例是在添加新方法之前创建的,但它仍然可以访问这个新方法。
尽管可以随时为原型添加属性和方法,并且个性能够立即在所有对象实例中反映出来,但如果是重写整个原型对象,那么情况就不一样了。我们知道,调用构造函数时会为实例添加一个指向最初原型的[[Prototype]]指针,而把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系。请记住:实例中的指针仅指向原型,而不指向构造函数。看下面的例子:
五、 寄生构造方法模式
通常,在前述几种模式都不适用的情况下,可以使用寄生(parasitic)构造函数模式。这种模式的基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象。但从表面上看,这个函数又很像是典型的构造函数。
在上面这段代码中,通过在构造函数的末尾添加一个return语句,可以重写调用构造函数时返回的值。这个模式可以在特殊情况下用来为对象创建构造函数。假设我们想创建一个具有额外方法的特殊数组,由于不能直接修改Array构造函数,因此可以使用下面的写法。
看完了JavaScript的几种设计模式后,大家是不是对JavaScript的写法很奇怪呢?
JavaScript的符号也很多,括号一旦写错,可能会引发灾难性的错误。所以,JavaScript是一个细活,喜欢的朋友一定要养成良好的编码习惯。对于复杂的业务JavaScript完全可以做的来。JavaScript 是一门灵活的语言,很多写法都可以发挥自己的创新思维来写,其灵活性同样也带来了很多问题。
在未来的日子里,Html5的快速发展之势必会让JavaScript的市场份额越来越大。喜欢前端的朋友可以一起来开拓、研究。