1. 门户大开型
它的所有属性和方法都是公开的,可访问的,这些公用的属性需要使用this关键字来创建。
优点:方便派生子类和进行单元测试,创建这样的对象不需要深入理解作用域或调用链的概念。
缺点:虽然我们为设置属性提供了赋值哭器方法,但那些属性仍然是公开的,可以被直接设置,而在这种方案中却无法阻止这种行为。不管是出于有间还是无意,isbn都可能被设置为一个无效值。
var Book=function(isbn, title, author){ this.setIsbn(isbn); this.setTitle(title); this.setAuthor(author);}Book.prototype={ checkIsbn: function(isbn){}, getIsbn: function(){ return this.isbn;}, setIsbn: function(isbn){ if(!this.checkIsbn(isbn)) throw new Error('Book: Invalid ISBN'); this.isbn=isbn; } getTitle: function(){ return this.title;} setTitle: function(title){ this.title=title||'No title specified';} getAuthor: function(){ return this.author;} setAuthor: function(author){ this.author=author||'No author specified';} display: function(){}}
2. 命名约定型:以下划线来表示方法或属性的私有性
下划线的这种用法是一个众所周知的命名规范,它表明一个属性(或方法)仅供对象内部使用,直接访问或设置它可能会导致意想不到的后果。这有助于防止程序员对它的无意使用,却不能防止对它的有意使用。后一个目标的实现需要有真正私有性的方法。
3. 使用闭包来创建真正的私有成员