javascript设计模式之:封装
javascript既是一门函数式语言,也是一门面向对象的语言,但是要想在javascript中实现类似于java中的private变量可不是一件显而易见的事。你需要借助它的函数式特性:闭包。
下面的例子演示了如何构建一个javascript对象,没有任何的隐藏和封装。
/** * 此demo演示了如何在javascript中实现面向对象语言中的信息封装和隐藏。由于javascript不像java那样在语言层面 * 提供了很好的封装支持,因此需要借助一些模式。 */Book = function(isbn, title, author) {if (!isbn) throw new Error('isbn is invalid');this.isbn = isbn;this.title = title;this.author = author;};Book.prototype = {display: function() {if (!this.isbn) throw new Error('invalid book');console.log('title :' + this.title + ' author: ' + this.author + ' isbn: ' + this.isbn);}};var book = new Book('0981531652','Actors In Scala', 'Philipp Haller / Frank Sommers');book.display();//可以直接的改变book中的成员,使得book不再是合法的bookbook.isbn = null;book.display();/** * 在很多javascript库中,通常约定以下划线 '_'开头的变量或者方法名为私有的变量和方法,不应该直接被外部调用 */Book = function(isbn,title,author) {if (!isbn) throw new Error('invalid isbn');this._isbn =isbn;this._title = title;this._author = author;};Book.prototype = {display: function() {if (!this._isbn) throw new Error('invalid book');console.log('title :' + this.title + ' author: ' + this.author + ' isbn: ' + this.isbn);}};var book = new Book('0981531652','Actors In Scala', 'Philipp Haller / Frank Sommers');book.display();//Book的开发者: oh, _isbn是一个似有变量,你不应该改变直接改变它。//调用者: 我不是故意的,代码调用层次太深了,我也不知道哪里导致一不小心被设置了。book._isbn = null;book.display();/** * 通过javascrit中的closure来实现真正的私有变量。 */Book = function(isbn, title, author) {var _isbn, _title, _author;//局部变量//局部方法function checkIsbn(isbn) {if (!isbn) throw new Error('cannot set invalid isbn');};this.getTitle = function() {return _title;};this.setTitle = function(title) {_title = title;};this.getIsbn = function() {return _isbn;};this.setIsbn = function(isbn) {checkIsbn(isbn);_isbn = isbn;};this.getAuthor = function() {return _author;};this.setAuthor = function(author) {_author = author;};this.setTitle(title);this.setIsbn(isbn);this.setAuthor(author);};Book.prototype = {display: function() {//这里我们不需要在检验isbn是否合法,因为每一次对isbn的更改都必须通过setIsbn的检查console.log('title :' + this.getTitle() + ' author: ' + this.getAuthor() + ' isbn: ' + this.getIsbn());}};var book = new Book('0981531652','Actors In Scala', 'Philipp Haller / Frank Sommers');try {book.setIsbn(null);}catch(e) {console.log(e.message);}book.display();