js最佳实战之----编程实践

 

1. 尊重对象所有权

它的意思是你不能修改不属于你的对象。简单的说,如果你不负责维护某个对象、它的对象或者他的方法,那么你就不能

对他们进行修改。

更具体的说:

    不要为实例或原型添加属性
    不要为实例或原型添加方法
    不要重定义已经存在的方法

对于多个人公用的对象进行改动就会产生错误。例如对stopEvent()的函数原本是取消某个事件的默认行为,但是你修改其,

然后他完成了原本的任务,又追加了另外事件处理程序,那么就出现了问题。

这些规则不仅适用于自定义类型和对象,对于诸如Object、String、document、window等原生类型和对象也适应。

所以,最佳的方法便是永远不修改不是由你所有的对象。你依然可以通过以下方式为对象创建新的功能:

    创建包含所需功能的新对象,并用它与相关对象进行交互;
    创建自定义类型,继承需要进行修改的类型。然后可以为自定义类型添加额外功能。

2. 避免全局量

尽可能避免全局变量和函数。最多创建一个全局变量,让其他对象和函数存在其中。请看以下例子:

//两个全局量--避免!

var name= "Nicholas";

function sayName(){

alert(name);

}

 

该段代码的问题:变量name覆盖了window.name属性,可能会与其他功能产生冲突;

其实可以创建一个包含两者的对象,如下例:

//一个全局量--推荐

var MyApplication = {

name:"Nicholas",

sayName:function(){

alert(this.name);

}

};

该段代码有助于消除功能作用域之间的混淆。

单一的全局量的延伸便是命名空间的概念,由YUI库普及。命名空间包括创建一个用于放置功能的对象,在YUI的2.x版本中,有若干用于

追加功能的命名空间,比如:

    YAHOO.util.Dom----处理DOM的方法
    YAHOO.util.Event----与事件交互的方法
    YAHOO.lang---用于底层语言特性的方法

对于YUI,单一的全局对象YAHOO作为一个容器,其中定义了其他对象。用这种方式将功能组合在一起的对象,叫做命名空间。

因此,它能够在同一个页面上与其他的javascript库共存。

你可以如下例所示开始创建命名控制来组合功能:

//创建全局对象

var Wrox = {};

//为Professional JavaScript创建命名空间

Wrox.ProJS={}

//将书中用到的对象附加上去

Wrox.ProJS.EventUtil = {};

Wrox.ProJS.CookieUtil = {};

在这个例子中,Wrox是全局量,其他命名空间子啊此之上创建。如果本书所有代码都放在Wrox.ProJS命名空间,

那么其他作者也应把自己的代码添加到Wrox对象中。只要所有人都遵循着规则,那么就不用担心其他人也创建叫做

EventUtil或者CookieUtil的对象了,因为他会存在于不用的命名空间中,请看一下例子:

//为Professional Ajax创建命名空间

Wrox.ProAjax = {};

//附加该书中所使用的其他对象

Wrox.ProAjax.EventUtil = {...};

Wrox.ProAjax.CookieUtil = {...};

//ProJS还可以继续分别访问

Wrox.ProJS.EventUtil.addHandler{...};

//以及ProAjax

Wrox.ProAjax.EventUtil.addHandler(...);

虽然命名空间会需要多些一些代码,但是对于可维护的目的而言是值得的。命名空间有助于确保代码可以在同一个页面上与其他代码以无害的方式一起工作。

3. 避免与null进行比较

最常见的类型检查就是查看某个值是否为null.但是,直接将值与null比较是使用过度的,并且常常由于不充分的类型检查导致错误。

看一下例子:

function sortArry(values){

if(values!=null){//避免!

values.sort(comparator);

}

}

该例子中,其他值还是可以通过检测的,比如字符串等。

现实中,与null比较很少适合情况而被使用。必须按照所期望的对值进行检查,而非按照不被期望的那么。例如,在前面的

范例中,values参数应该是一个数组,那么就要检查它是不是一个数组,而不是检查它是否非null.函数按照下面方式修改更加

适合:

function sortArray(values){

if(values instanceof Array){//推荐

values.sort(comparator);

}

}

如果你是从一个框架将数组传递到另一个框架,那么就要另外检查是否存在sort()方法了。

如果看到了与Null比较的代码,尝试使用以下技术替换:

    如果值应为一个引用类型,使用instanceof操作符检查其构造函数;
    如果值应为一个基本类型,使用typeof检查其类型;
    如果是希望对象包含某个特定的方法名,则使用typeof操作符确保执行名字的方法存在于对象上。

代码中的Null比较越少,就越容易确定代码的目的,并消除不必要的错误。

4. 使用常量

这种将数据从应用逻辑分离出来的思想,可以在不冒引入错误的风险的风险的同时,就改变数据。

如下例:

function validate(value){

if(!value){

alert("Invalid value!");

location.href="/errors/invalid.php";

}

}

显示在用户界面上的字符串应该以允许进行语言国际化的方式抽取出来。

URL也应该被抽取出来,因为他们随着应用成长而改变的倾向。

将应用逻辑与数据分离开来。请看一下例子:

var Constants = {

INVALID_VALUE_MSG : "Invalid value!";

INVALID_VALUE_URL : "/errors/invalid.php";

}



function validate(value){

if(!value){

alert(Constants.INVALID_VALUE_MSG);

location.href= Constants.INVALID_VALUE_URL;

}

}


Constants对象甚至可以完全在单独的文件中进行定义,同时该文件可以由包含正确值的其他过程根据国际化设置来完成。

关键在于将数据和使用它的逻辑进行分离。要注意的值的类型那个如下所示:

  • 重复值---任何在多处用到的值都应抽取为一个常量。
  • 用户界面字符串 ----任何用于显示给用户的字符串,都应被抽取出来以便国际化。
  • URLS ---在Web应用中,资源位置很容易变更,所以推荐用一个公共地方存放所有的URL
  • 任意可能会更改的值---每当你在用到字面量值的时候,你都应确定是否要变化,如果“是”,就应该抽取。

对于企业级的javascript开发语言,使用常量是非常重要的技巧,因为它能让代码更容易维护,并且在数据更改的同时

保护代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值