Web开发时,我们可能经常抱怨,javascript。它太耗时间精力,甚至让我们觉得它恶心。服务器端,我们有优秀的java语言和webwork、spring等框架来帮助我们提高效率。而客户端只有灵活、难以掌握的javascript,那么我们的希望在哪呢?但愿下面的内容能够对你有些帮助。
1、它是怎样的?
Javascript目前由二块构成:Core(核心部分)+DOM实现部分。(DOM是w3c定义的针对HTML、XML文档编程的一系列接口。通过这些接口,我们可以改变文档结点的结构、样式、内容。实现这些接口的语言可以是java、Python,javascript等。)
Core
|
定义了语法规则,及内置的全局对象(Date、Function等),全局方法(parseFloat),全局属性(NaN,undefined等)
|
Dom
|
针对HTML文档与XML文档操作的API
|
2、 慢在哪?
2.1、java VS javascript
Java是面向对象的代表性语言之一,面向对象语言是时下比较流行、开发效率高的主流开发语言。
面向对象语言包括几个主要特性:抽象,继承,封装和多态。Javascript本质上不是面向对象的,而是基于对象的。基于对象的语言对上面四个特性
支持很差,或者只支持部分特性。
|
抽象
|
继承
|
多态
|
封装
|
java
|
具备:类,接口,抽象类四个概念
|
支持:
通过关键字
Extends,implements实现
|
支持:
1)表现在对象的方法可以重载
2)子类可以被当作父类处理
|
支持:
private,
friendly,
protected,
public
四个级别的封装
|
javascript
|
仅具备:
类,这一个概念
|
支持很差:
通过prototype实现;
Function的apply或call方法间接实现。
|
不支持
|
支持很差:仅支持private,
public二个级别
|
比较结果
|
1
恶劣的继承导致:无法实现子类与父类之间关系的判断,并且子类无法转化成父类。所以无法根据类的类型处理业务:处理父类的代码,无法处理子类。——扩展性差
2
陈旧的代码书写方式导致:本不好的封装性变的更加差劲。这样对象间的隔离成本增加,内聚性弱。
| |||
大大降低了开发效率
|
2.2、浏览器的兼容性
Core与Dom部分都存在着浏览器平台的差异性,
进一步降低了开发的效率。
3、 开始加速
3.1、加强封装性
提倡的写法
- function A(){
- var locate1 = "1oh";
- this.locate2 = "2oh";
- var method1 = function(){
- alert(locate1);
- }
- this.method2 = function(){
- alert(this.locate2);
- method1();
- }
- }
优点:封装性好,实现代码变化的隔离。
缺点:代码可读性差。
弥补方式:利用javascript的优秀插件,如:jseclipse。
禁止的写法
function A(){ var locate1 = "1oh"; var method1= function(){ alert(locate1); }; } A.prototype={ locate2:"2oh", method2:function(){ alert(this.locate2); }, method3:function(){ alert(locate1); method1(); } } var a = new A(); a.method2(); a.method3();
优点:
代码可读性好。
缺点:
没有全局的私有变量
|
如果执行
a.method3();根本无法访问变量locate1。
|
prototype
中的方法是公共的。
|
a.method2()成功访问,在prototype中定义的方法是public级别;无法在prototype中定义全局的private变量。
|
总体效果
|
1) 封装性极其差
2) 代码调用不方便。
|
3.2 类继承
禁止写法
prototype继承
|
万恶之首:目前有很多继承写法,都是直接或者间接使用它。
严重破坏封装性。
|
没法实现多态:只是简单的复用,这种继承意义不大。
| |
apply,
或者call
|
只是复用
:简单的在当前对象中,执行对象之外的另一个方法。
|
这几种javascript的继承写法虽然目前被大量的使用,但是他们的缺点是明显的,因此我们不建议采用这些常见的javascript继承写法。
推荐写法
例子很长,先给大家一些看完的动力吧,下面是它的优点。
代码复用
|
如果A继承B,那么A可复用B中public级别的资源
|
单一,多层的继承
|
B可以继承C,A可以继承B,
不存在A继承B又继承C。
|
多态
|
A是父类,B与C是A的子类,如果存在一个方法X,是处理A类的,那么它也能处理B与C类。
扩展性好,容纳了变化:可以处理,将来因业务需求新建的D类。
|