1. 程式人生 > >JS中如何在外部引用私有變量的兩種方法 復習

JS中如何在外部引用私有變量的兩種方法 復習

href per 全局變量 strong tail 避免 style 包含 product

引用: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()會影響所有的實例。

JS中如何在外部引用私有變量的兩種方法 復習