JavaScript不同于其他的面向对象语言,没有类的实现,但是有基于原型的面向对象,这两天看了JavaScript设计模式和阮一峰老师的JavaScript面向对象的总结,现在总结一下这两天自己学到了什么。
JavaScript中没有块级作用域,但是有函数作用域,也就是说在一个函数里面的变量,在函数外部是无法访问到的,利用这个特性,我们可以做到实现私有变量和私有方法。
function Cat()//Cat类的实现 { var name=cat;//私有变量 play:function(){};//私有方法 }
既然实现了私有方法和私有变量,那么我们怎么可以实现公有方法和公有变量呢?
这时候我们就用到了this,用this创建的变量和方法,在类创建对象的时候,每个对象自身都拥有一份并且可以在外部访问到,因此我们可以把这些变量看做公有变量和方法,而且这些变量和方法可以访问到对象自身的私有属性和私有方法,所以我们称这些方法为特权方法。
function Cat(name) { this.play=function(){};//特权方法 this.name=name;//对象公有属性 }
在类外用点方法添加的方法和属性通过new创建的对象没有执行到,所以,通过新创建的类无法访问到这些方法,这些方法称为静态公有方法,这些属性称为静态公有属性
//以下直接引用了JavaScript设计模式里的原例子 Book.isChinese=true;//类静态公有属性(对象不能访问) Book.resetTime=function(){};//类静态公有方法(对象不能访问) Book.prototype={ //公有属性 isJSBook:false, //公有方法 display:function(){}; }
那么我们如何利用闭包来实现一个类的构建呢?
//同样引用了JavaScript设计模式里的例子
var Book=(function(){
//静态私有变量
var bookNum=0;
//静态私有方法
function checkBook(name)
{}
//返回构造函数
return function(newId,newName,newPrice)
{
//私有变量
var name,price;
//私有方法
function checkID(id){};
//特权方法
this.fun=function(){};
}
})();
Book.prototype={
//静态公有属性
isJSBook:true,
//静态公有方法
display:function(){};
}
上述例子原型属性和闭包分割开来,给人的感觉并不太好,那么,如何用闭包来实现一个完整的不分割开来的类呢
//同样引用了JavaScript设计模式里的例子
var Book=(function(){
//静态私有变量
var bookNum=0;
//静态私有方法
function checkBook(name)
{}
//返回构造函数
function _book(newId,newName,newPrice)
{
//私有变量
var name,price;
//私有方法
function checkID(id){};
//特权方法
this.fun=function(){};
}
_book.prototype={
//静态公有属性
isJSBook:true,
//静态公有方法
display:function(){};
}
return _book;//返回这个类
})();