1.定义命名空间 ->>> 创建一个局部可用的对象,在对象中封装局部作用域内的有用代码.
命名空间创建了一个新的局部作用域,将其他代码与完全作用域分开。避免命名冲突
命名空间对象标识符需唯一。
可以使用姓名或者字头作为名称的一部分,在定义中最好添加程序库的相关信息。
在javascript中,可以定义一个对象来创建命名空间
var someNameSpace={
someProperty:23,
someMethod:function(){...}
}
定义后,可以使用对象标记法访问属性和方法:someNameSpace.someProperty和someNameSpace.someMethod()。
2.创建一个配置对象
对象在分布式代码中的另一种常见用途是作为配置工具,可以轻松地在多个项目上使用相同的javascript代码,而不需要找遍大量代码行,编辑具体值。
配置对象的创建方法:
定义一个自定义对象,用其属性代表网站专用的设置
var CONFIG={
host:‘http://www.example.com‘,
errorClass:‘error‘,
outputElement:‘output‘,
...
};
以后,其他javascript代码可以引用配置对象里面的配置,如:
elem.className=CONFIG.errorClass;
3.创建自定义对象
创建单个自定义对象,只需要创建一个类型为Object的新变量:
如:
var obj={
name:‘xiaowei‘,
gender:‘male‘,
getName:function(){
return this.name;
},
getGender:function(){
return this.gender;
}
};
4.创建自定义对象的多个实例----->>>使用一个函数作为对象生成器。
举例:
//1.使用构造函数构造对象
function Employee(firstName ,lastName,department)
{
this.firstName=firstName;
this.lastName=lastName;
this.department=lastName;
this.getName=function(){
return this.firstName+‘ ‘+this.lastName;
}
};
//2.使用new运算符生成对象(必须使用new)
var e1=new Employee(‘Jane‘,‘Doe‘,‘Acounting‘);//new一个Employee对象
var e2=new Employee(‘John‘,‘Smith‘,‘Human Resouse‘);//new 另外一个Employee对像
注意:为了与javascript中其他对象表现一致,可以自定义对象的同时,定义toString()和valueOf()方法。
5.javascript原型
javascript是不同类型的面向对象语言,它是原型化的。意味着:所创建的对象继承自一个预定义模型(原型),而不是类定义。
每个javascript对象都继承其原型中的属性和方法。
原型链概念--->>> 举例说明:e1对象基于Employee原型,而Employee原型由基于Object,这种现象称为原型链。
--->>>我们引用任何对象的属性和方法,javascript遍历原型链,寻找对应属性。
--->>>javascript在到达根原型时停止遍历(Object原型为根原型),如果原型链中没有找到对应属性和方法,则返回undefined。
为了区分对象内定义,还是原型链中的属性和方法,可以调用hasOwnProperty()方法,以需要区分的属性作为参数,(此方法在Object中已定义,因而所以对象都将继承)
如:
var test={
thing:1
};
test.hasOwnProperty(‘thing‘);//返回true
test.hasOwnProperty(‘valueOf‘);//返回false
添加原型方法:在javascript中,可以编辑对象的protype属性来修改原型的属性和方法
如:下面添加一个新的方法
function Employee(firstName ,lastName,department)
{
this.firstName=firstName;
this.lastName=lastName;
this.department=lastName;
this.getName=function(){
return this.firstName+‘ ‘+this.lastName;
}
};
Employee.prototype.getNameBackwards=function(){//添加的原型方法。现在所有new 的Employee对象都可以使用此方法
return this.lastName+‘,‘+this.firstName;
}
追溯式修改原型的能力,甚至能修改内建于javascript的对象定义,如String.下面的代码为String添加一个trim()方法(如果String中还没有这个方法)
if(typeof String.prototype.trim=‘undefined‘){//创建向后兼容的对象
String.prototype.trim=function(){
return this.replace(/^\s+|\s+$/g,‘‘);
};
}
注意:尽管javascript允许修改原型,但原型的修改是全局的,会影响原型所有的实例,所以需谨慎使用
如果只需在特定实例上使用一个函数,可以单独创建该函数,以该对象为参数调用它:
function doSomeThing(obj){
// Do something with obj;
}
也可以将函数定义添加到单个实例:
var obj={};
obj.doSomeThing=function(){
//Do something with this;
}
7.使用闭包
闭包是与其创建时所在作用域绑定的函数。这意味着:闭包函数可以使用函数创建时(在同一个作用域)已有的变量。
粗略的说,可以在一下情形可能遇到闭包:
①在一个函数中定义另一个函数
②内部函数引用存在于外部函数中的变量(包括外部函数的参数)
③内部函数在外部函数运行停止后被调用
举例说明:
window.onload=function(){
//设置变量,包含变量tasks
document.getElementById(‘theForm‘).onsubmit=function(){
tasks.push(t);
};
};
onload函数只被调用一次:在页面加载时,该函数定义了tasks数组,
在常规的非闭包的情况下,函数变量执行就不再可用,意味着tasks数组将在onload函数执行完后所有命令之后不再存在。
在onload外部函数中定义另一个函数创建了闭包。所有闭包都要求在另一函数中定义,内部函数处理表单提交,将被调用许多次,
但是调用的时间总是在外部函数结束执行之后。