成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

JavaScript私有變量實例詳解

本文實例講述了JavaScript私有變量。分享給大家供大家參考,具體如下:

為興慶等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及興慶網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為成都網(wǎng)站制作、成都網(wǎng)站設計、興慶網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

任何在函數(shù)中定義的變量,就是私有變量,因為這些變量在函數(shù)外部是無法訪問到的??偟膩碚f,私有變量包括函數(shù)的參數(shù)、局部變量和在函數(shù)內(nèi)部定義的其他函數(shù)。

function add(num1, num2){
  var sum = num1 + num2;
  return sum;
}

上面的例子中的 num1, num2, sum 就是函數(shù)的私有變量。

如果在這個函數(shù)內(nèi)部創(chuàng)建一個閉包,那么閉包通過自己的作用域鏈也可以訪問這些變量,利用這一點,就可以創(chuàng)建用于訪問私有變量的公有方法。

有權訪問私有變量和私有函數(shù)的公有方法叫做特權方法。

1. 構造函數(shù)模式

創(chuàng)建特權方法的方式有兩種,第一種是在構造函數(shù)中定義:

function MyObject(){
  //私有變量
  var privateVariable = 10;
  //私有函數(shù)
  function privateFunction(){
    return false;
  }
  //特權方法
  this.publicMethod = function(){
    privateVariable++;
    return privateFunction();
  };
}

這里定義的的特權方法是一個閉包,所以能夠訪問在構造函數(shù)中定義的私有變量和私有函數(shù)。在創(chuàng)建 MyObject 實例后,只能通過特權方法來訪問定義的私有變量和函數(shù)。

利用這種技術,可以隱藏那些不能被外部直接修改的數(shù)據(jù):

function Person(name){
  this.getName= function () {
    return name;
  };
  this.setName= function (value) {
    name=value;
  }
}
var person=new Person("deniro");
console.log(person.getName());//deniro
person.setName("lily");
console.log(person.getName());//lily

上面的代碼定義了兩個特權方法,它們都可以在函數(shù)外部被調(diào)用,因為它們是閉包,所以可以通過作用域訪問 name。name 在 Person 的每一個實例中都不同,因為每次調(diào)用構造函數(shù)都會重新創(chuàng)建這兩個方法。

在構造函數(shù)中創(chuàng)建特權方法的缺點是,必須使用構造函數(shù)模式來實現(xiàn),而這樣做會在每個實例上創(chuàng)建同樣的一組新方法!

2. 靜態(tài)私有變量模式

通過在私有作用域中定義私有變量和函數(shù),也可以創(chuàng)建特權方法,基本模式是:

(function(){
  //私有變量
  var privateVariable = 10;
  //私有函數(shù)
  function privateFunction(){
    return false;
  }
  //構造函數(shù)
  MyObject = function(){
  };
  //公有/特權方法
  MyObject.prototype.publicMethod = function(){
    privateVariable++;
    return privateFunction();
  };
})();

公有方法在原型上定義,使用的原型模式。另外,我們使用的是函數(shù)表達式來定義構造函數(shù),而且沒有用 var,這種在初始化時未經(jīng)聲明的變量,就會創(chuàng)建一個全局變量。因此,MyObject 就成了一個全局變量,能夠在私有作用域之外被訪問到。但在嚴格模式下給未經(jīng)聲明的變量賦值會導致錯誤。

這種方式定義的私有變量和函數(shù)是實例之間共享的。因為特權方法是在原型上定義的,因此所有實例都使用同一個函數(shù)。又因為這個特權方式是一個閉包,所以它保存著對包含它的作用域的引用:

(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("deniro");
console.log(person1.getName());//deniro
person1.setName("lily");
console.log(person1.getName());//lily
var person2 = new Person("Jack");
console.log(person2.getName());//Jack
console.log(person1.getName());//Jack

因此每個實例都沒有自己的私有變量。

注意: 如果作用域鏈較長,可能會在一定程度上影響查找速度。這正是使用閉包和私有變量的一個明顯不足。

3. 模塊模式

模塊模式是為單例創(chuàng)建私有變量和特權方法。單例指的是只有一個實例的對象,按照慣例,JavaScript 是按照對象字面量的方式來創(chuàng)建單例對象的:

var singleton = {
  name : value,
  method: function(){
    //方法代碼
  }
}

模塊模式為單例新增了私有變量和特權方法:

var singleton = function(){
  //私有變量
  var privateVariable = 10;
  //私有函數(shù)
  function privateFunction(){
    return false;
  }
  //特權/公有方法和屬性
  return {
    publicProperty: true,
    publicMethod: function(){
      privateVariable++;
      return privateFunction();
    }
  };
}();

模塊模式使用了一個返回對象的匿名函數(shù)。在這個匿名函數(shù)內(nèi)部,首先定義了私有變量和函數(shù),然后將一個對象字面量作為函數(shù)的值返回。返回的對象字面量只包含可以公開的屬性和方法。這個對象是在匿名函數(shù)內(nèi)部定義的,所以它的公有方法有權訪問私有變量和函數(shù)。這種模式在需要對單例進行某些初始化,同時又需要維護其私有變量時很有用:

var BaseComponent = {};
var application = function () {
  //私有變量和函數(shù)
  var components = new Array();
  //初始化
  components.push(new BaseComponent());
  //公共
  return {
    getComponentCount: function () {//返回已注冊的組件數(shù)
      return components.length;
    },
    registerComponent: function (component) {//注冊新組件
      if (typeof component == "object") {
        components.push(component);
      }
    }
  };
}();

在 web 程序中,經(jīng)常需要使用一個單例來管理應用程序級的信息。這個例子創(chuàng)建了一個用于管理組件的 application 對象。首先聲明一個私有 components 數(shù)組,然后為它添加了一個 BaseComponent 實例(BaseComponent 實際代碼不重要,這里主要是為了演示初始化),返回的對象包含有權訪問數(shù)組的特權方法。

如果創(chuàng)建一個對象時,需要對其進行初始化,同時還要公開一些能夠訪問這些私有數(shù)據(jù)的方法,那么就可以使用模塊模式。

4. 增強的模塊模式

這種模式適合那些單例必須是某種類型的實例,同時還必須添加某些屬性或方法對其增強的情況:

var singleton = function(){
  //私有變量
  var privateVariable = 10;
  //私有函數(shù)
  function privateFunction(){
    return false;
  }
  //創(chuàng)建對象
  var object = new CustomType();
  //添加特權/公有方法和屬性
  object.publicProperty = true;
  object.publicMethod = function(){
      privateVariable++;
      return privateFunction();
  };
  //返回這個對象
  return object;
}();

我們把之前的例子改成增強的模塊模式:

var BaseComponent = {};
var application = function () {
  //私有變量和函數(shù)
  var components = new Array();
  //初始化
  components.push(new BaseComponent());
  //創(chuàng)建 application 的一個局部副本
  var app = new BaseComponent();
  //公共接口
  app.getComponentCount = function () {
    return components.length;
  };
  app.registerComponent = function (component) {
    if (typeof component == "object") {
      components.push(component);
    }
  };
  //返回這個副本
  return app;
}();

更多關于JavaScript相關內(nèi)容還可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調(diào)試技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數(shù)學運算用法總結》

希望本文所述對大家JavaScript程序設計有所幫助。

網(wǎng)站標題:JavaScript私有變量實例詳解
當前網(wǎng)址:http://jinyejixie.com/article22/gcspjc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供建站公司App開發(fā)、移動網(wǎng)站建設企業(yè)網(wǎng)站制作、品牌網(wǎng)站建設外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設
平原县| 于都县| 定西市| 明光市| 明水县| 高邮市| 科技| 西畴县| 南昌县| 大余县| 西乡县| 博罗县| 凉城县| 民和| 长沙市| 阿拉善左旗| 威宁| 北流市| 同仁县| 宝应县| 砀山县| 信阳市| 阳朔县| 阿合奇县| 龙口市| 永州市| 尉犁县| 特克斯县| 铜山县| 乐安县| 临高县| 新丰县| 南木林县| 山丹县| 洱源县| 卓尼县| 株洲县| 富锦市| 治多县| 那坡县| 门头沟区|