国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

JavaScript私有變量實例詳解

2024-05-06 16:47:52
字體:
來源:轉載
供稿:網友

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

任何在函數中定義的變量,就是私有變量,因為這些變量在函數外部是無法訪問到的。總的來說,私有變量包括函數的參數、局部變量和在函數內部定義的其他函數。

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

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

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

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

1. 構造函數模式

創建特權方法的方式有兩種,第一種是在構造函數中定義:

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

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

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

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

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

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

2. 靜態私有變量模式

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

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

公有方法在原型上定義,使用的原型模式。另外,我們使用的是函數表達式來定義構造函數,而且沒有用 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("deniro");console.log(person1.getName());//deniroperson1.setName("lily");console.log(person1.getName());//lilyvar person2 = new Person("Jack");console.log(person2.getName());//Jackconsole.log(person1.getName());//Jack

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

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

3. 模塊模式

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

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

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

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

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

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

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

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

4. 增強的模塊模式

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

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

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

var BaseComponent = {};var application = function () {  //私有變量和函數  var components = new Array();  //初始化  components.push(new BaseComponent());  //創建 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程序設計有所幫助。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 潼南县| 贺州市| 镇巴县| 南华县| 巴林左旗| 昭平县| 泗阳县| 雅江县| 互助| 穆棱市| 香河县| 云梦县| 木兰县| 临泽县| 丰台区| 康乐县| 江安县| 凤城市| 平阴县| 金塔县| 达尔| 浮梁县| 阜城县| 翼城县| 忻城县| 唐海县| 桐乡市| 阜新| 海阳市| 沙坪坝区| 西和县| 肇源县| 咸阳市| 柘荣县| 天峨县| 高陵县| 肥城市| 孙吴县| 海盐县| 太湖县| 奎屯市|