引用:https://blog.csdn.net/liwenfei123/article/details/77964222
運用閉包的特權方法
在構造函數中定義特權方法
- 這種模式在構造函數中定義了所有私有變量和函數。
- 能夠在構造函數中定義特權方法是因為特權方法作為閉包,能夠訪問在構造函數中定義的所有變量和函數。
function product(){ var name='yuxiaoliang'; this.getName=function(){ return name; } } var obj=new product(); console.log(obj.getName()) // "yuxiaoliang"
function Person(name){ this.getName=function(){ return name; }; this.setName=function(value){ name=value; }; } var person=new Person('Lee'); alert(person.getName());//'Lee' person.setName('lwf'); alert(person.getName());//'lwf'
- 私有變量name在Person的每個實例中都不相同,因為每次調用構造函數都會重新創建這兩個方法。
- 構造函數模式的缺點就是針對每個實例都會創建同樣一組新方法,而使用靜態私有變量來實現特權方法就可以避免這個問題。
靜態私有變量
(function(){ //私有變量和私有函數 var privateVariable = 10; function privateFunction(){ return false; } //構造函數 MyObject = function(){ } //公有/特權方法 MyObject.prototype.publicMethod = function(){ privateVariable ++; return privateFunction(); } })(); var object = new MyObject(); console.log(object.publicMethod());//false
-
上面模式在定義構造函數時並沒有使用函數聲明,而是使用了函數表達式。函數聲明只能創建局部函數,我們需要在私有作用域外面使用構造函數。聲明MyObject時也沒有使用var,這樣MyObject就成了一個全局變量,能夠在私有作用域之外被訪問。
-
由於特權方法是在原型上定義的,因此所有的實例都使用同一個函數,而這個特權方法,作為一個閉包,總是保存着對包含作用域的引用。
(function(){ var name = ''; Person = function(value){ name = value; } Person.prototype.getName = function(){ return name; } Person.prototype.setName = function(value){ name = value; } })(); var person1 = new Person('Tom'); var person2 = new Person('Lucy'); console.log(person1.getName());//Lucy console.log(person2.getName());//Lucy
- 這個例子Person構造函數和getName()和setName()方法都能訪問私有變量name,變量name就變成了一個靜態的、所有實例共享的屬性。也就是在一個實例上調用setName()會影響所有的實例。