《JavaScript高级程序设计》第6-7章
第六章 面向对象的程序设计
1、理解对象:无序属性的集合,其属性可以包含基本值、对象或者函数
1)属性类型:
数据属性:4个特性——[[Configurable]]表示能否通过delete删除属性从而重新定义属性,能否删除属性的特性,或者能否把属性修改为访问器属性,这个特性默认值为true;[[Enumerable]]表示能否通过for-in循环返回属性,这个特性默认值为true;[[Writable]]表示能否修改属性的值,这个特性默认值为true;[[Value]]包含这个属性的数据值,读取属性值的时候从这个位置读,写入属性值的时候把新值保存在这个位置;要修改属性默认的特性,必须使用ECMAScript5的object.defineProperty()方法,接收三个参数——属性所在的对象、属性的名字和一个描述符对象
访问器属性:不包含数据值,包含一对getter和setter函数,在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据;4个特性——[[Configurable]]表示能否通过delete删除属性从而重新定义属性,能否删除属性的特性,或者能否把属性修改为访问器属性,这个特性默认值为true;[[Enumerable]]表示能否通过for-in循环返回属性,这个特性默认值为true;[[Get]]在读取属性时调用的函数,这个特性默认值为undefined;[[Set]]在写入属性时调用的函数,这个特性默认值为undefined;要修改属性默认的特性,必须使用ECMAScript5的object.defineProperty()方法,接收三个参数——属性所在的对象、属性的名字和一个描述符对象
2)定义多个属性:ECMAScript5定义了object.defineProperties()方法用于定义多个属性,接收两个参数——要添加和修改其属性的对象和要添加和修改其属性的对象的属性,IE9+、Firefox4+、Safari5+、Opera12+、Chrome有效
3)读取属性的特性:ECMAScript5定义了object.getOwnPropertyDescriptor()方法用于取得给定属性的描述符,接收两个属性——属性所在的对象和要读取其描述符的属性名称
2、创建对象
1)工厂模式:用函数来封装以特定接口创建对象的细节
2)构造函数模式:
没有显式地创建对象;直接将属性和方法赋给了this对象;没有return语句
调用构造函数的4个步骤——创建一个新对象;将构造函数的作用域赋给新对象(this指向这个新对象);执行构造函数中的代码(为这个新对象添加);返回新对象
构造函数与其他函数的区别:构造函数应该以一个大写字母开头,非构造函数则应该以一个小写字母开头;构造函数通过new操作符来调用;构造函数的每个方法都要在每个实例上重新创建
3)原型模式
3、继承:ECMAScript只支持实现继承
第七章 函数表达式
函数声明:function functionName(arg0,arg1,arg2){//函数体},在执行代码之前会先读取函数声明
函数表达式:var functionName=function(arg0,arg1,arg2){//函数体},这个情况下创建的函数叫做匿名函数(拉姆达函数)
1、递归:
arguments.callee是一个指向正在执行的函数的指针,因此可以用它实现对函数的递归调用
function factorial(num){
f(num <= 1){
return1;
}else{
return num*arguments.callee(num-1);
}
}
在严格模式下,不能通过脚本访问arguments.callee
var factorial=(function f(num){
f(num <= 1){
return1;
}else{
return num*f(num-1);
}
});
2、闭包:有权访问另一个函数作用域中的变量的函数;创建闭包的常见方式,就是在一个函数内部创建另一个函数
3、模仿块级作用域:块级作用域(私有作用域)的匿名函数:(function(){//这里是块级作用域})();
4、私有变量:包括函数的参数、局部变量和在函数内部定义的其他函数;特权方法:有权访问私有变量和私有函数的公有方法;
在构造函数中定义特权方法:
function MyObject(){
//私有变量和私有函数
var privateVariable=10;
Function privateFunction(){
return false;
}
//特权方法
this.publicMethod=function(){
privateVariable++;
return privateFunction();
};
}
静态私有变量:通过在私有作用域中为自定义类型定义私有变量或函数以及特权方法,这个模式与在构造函数中定义特权方法的主要区别,就在于私有变量和函数是由实例共享的。其基本模式如下:
(function(){
//私有变量和私有函数
var privateVariable=10;
function privateFunction(){
return false;
}
//构造函数
MyObject=function(){
};
//公有/特权方法
MyObject.prototype.publicMethod=function(){
privateVariable++;
return privateFunction();
};
})();
模块模式:为单例创建私有变量和特权方法;单例:指的就是只有一个实例的对象,JavaScript是以对象字面量的方式来创建单例对象。其基本模式如下:
var singleton=function(){
//私有变量和私有函数
var privateVariable=10;
function privateFunction(){
return false;
}
//特权/公有方法和属性
return{
publicProperty:true;
publicMethod:function(){
privateVariable++;
return privateFunction();
}
};
}();
增强的模块模式
var singleton=function(){
//私有变量和私有函数
var privateVariable=10;
function privateFunction(){
return false;
}
//创建对象
var object=new CustomType();
//添加特权/公有方法和属性
object.publicProperty=true;
publicMethod=function(){
privateVariable++;
return privateFunction();
};
//返回这个对象
return object;
}();