封装 + 信息隐藏
why?
让你同原始数据解耦和
what?
三种定义对象的方法
1 完全暴露在外的方法(利用传统的,用函数模拟构造函数。因为所有的属性和方法都是公开的public)
var Book = function(isbn,title,author){
this.isbn = isbn;
this.title = title;
this.author = author;
}
Book.prototype.display = function(){this.checkIsbn();....}
Book.prototype.checkIsbn = function(){}
所有的方法都暴露在外,即使checkIsbn不需要暴露在外。同时,所有的属性也暴露在外。isbn属性,应该在对象创建完后,不能修改。但用这种方法,仍然可用通过对象修改isbn的属性。
var jsbook = new Book('9999','js','MCZ');
jsbook.isbn='8888';
2 利用命名习惯,来说明私有变量和函数。即以‘_'开头,则表示私有的,不应该通过对象直接访问。
但问题也很明显,这种方法不能强制执行
3 利用闭包来实现
var Book = function(isbn,title,author){
var is,ti,au;
//privileged methods
this.setIsbn = function(isbn){is=isbn;}
this.setTitle = function(title){ti=title;}
this.setAuthor = function(author){au=author;}
this.setIsbn(isbn);
this.setTitle(title);
this.setAuthor(author);
}
Book.prototype.display = function(){} //public ,non-privileged methods
优点是实现了信息隐藏。缺点是:每个对象将有一份private 和 privileged method,这将可能非常耗内存;同时,这个模式非常难用于继承,因为子类将不能访问父类的私有属性和方法。
静态属性和方法
静态属性和方法是与类本身进行交互的,与对象无关。静态成员只会在内存中保存一份。
var Book = (function(){
//private static attributes
var numOfBooks = 0;
//private static method
function checkIsbn(isbn){}
//return the constructor
return function(newIsbn,newTitle,newAuthor){
//private attribute
var isbn,title,author;
...............
numOfBooks++;
}
})();
//public static method
Book.convertToTitleCase = function(inputString){}
类的私有、特权成员定义在构造函数中,分别用var 和this。类的静态成员定义在闭包中。
常量
常量是值不会变的变量,在js中通过闭包来实现
var Constants = (function(){
var a = 100;
var getA=function(){return a;};
return {getA:getA};
})();
alert(Constants.getA());