亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JavaScript私有變量實例詳解

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

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

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

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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
姬川优奈aav一区二区| 亚洲人成在线电影| 欧美成人全部免费| 国产精品入口日韩视频大尺度| 欧美亚洲视频在线看网址| 国产一区二区三区毛片| 久久这里只有精品99| 欧美电影免费看| 亚洲大尺度美女在线| 亚洲免费中文字幕| 91精品在线国产| 亚洲a∨日韩av高清在线观看| 欧美在线xxx| 日本精品在线视频| 亚洲国产婷婷香蕉久久久久久| 久久久999精品免费| 成人羞羞国产免费| 亚洲一区二区三区毛片| 亚洲国产高清福利视频| 亚洲一品av免费观看| 色婷婷av一区二区三区久久| 日韩暖暖在线视频| 亚洲综合小说区| 疯狂做受xxxx欧美肥白少妇| 国产成+人+综合+亚洲欧洲| 成人亲热视频网站| 国产免费观看久久黄| 成人网在线免费观看| 欧美中文字幕视频| 欧美在线国产精品| 国产精品三级美女白浆呻吟| 日韩欧美一区二区三区| 亚洲淫片在线视频| 久久国产精品久久久久| 亚洲视屏在线播放| 亚洲人成77777在线观看网| 久久久久日韩精品久久久男男| 91超碰中文字幕久久精品| 国产精品久久久久久网站| 国产丝袜一区二区三区免费视频| 欧洲亚洲免费视频| 国模私拍一区二区三区| 色777狠狠综合秋免鲁丝| 亚洲视频在线视频| 日韩免费黄色av| 亚洲а∨天堂久久精品9966| 亚洲第一福利在线观看| 精品成人在线视频| 成人激情视频免费在线| 精品国产一区二区三区久久| 国产91在线播放| 最新中文字幕亚洲| 亚洲天堂免费视频| 欧美日韩一区二区三区在线免费观看| 欧美精品18videos性欧美| 91久久久亚洲精品| 91中文字幕在线观看| 日本亚洲精品在线观看| 色综合久久天天综线观看| 国产精品久久久久久久久| 亚洲一区二区三区sesese| 欧美有码在线观看| 久久久久久久久国产| 中文字幕亚洲专区| 国产在线精品成人一区二区三区| 欧美日韩在线免费观看| 久久久精品在线观看| 亚洲成人激情在线观看| 亚洲aaaaaa| 亚洲开心激情网| 日韩麻豆第一页| 中日韩美女免费视频网址在线观看| 一区二区三区无码高清视频| 色老头一区二区三区| 国产在线98福利播放视频| 欧美在线一级视频| 91精品久久久久久久久久另类| 日韩精品福利网站| 欧美韩国理论所午夜片917电影| 久热国产精品视频| 成人国产精品久久久久久亚洲| 国产美女扒开尿口久久久| 亚洲国产成人精品一区二区| 亚洲一区第一页| 亲子乱一区二区三区电影| 亚洲精品久久久久久久久久久| 日韩av在线资源| 国产精品视频最多的网站| 最近2019好看的中文字幕免费| 欧美成在线视频| 久久中文字幕在线| 国产欧美日韩亚洲精品| 国产美女精品免费电影| 精品久久久久久久久久久久久| 国产91精品在线播放| 国产精品日韩专区| 最新国产成人av网站网址麻豆| 最近2019年日本中文免费字幕| xvideos国产精品| 亚洲成人三级在线| 欧美综合在线第二页| 国产精品久久中文| 亚洲精品国产精品国产自| 国产精品三级久久久久久电影| 92国产精品久久久久首页| 成人免费视频a| 亚洲一区二区久久久久久久| 国产精品扒开腿做爽爽爽视频| 夜夜嗨av一区二区三区四区| 亚洲精品www| 色yeye香蕉凹凸一区二区av| 亚洲国产另类久久精品| 国产69精品99久久久久久宅男| 亚洲午夜女主播在线直播| 在线播放国产一区二区三区| 日韩av中文字幕在线| 91免费电影网站| 国产精品免费久久久久影院| 亚洲变态欧美另类捆绑| 97超碰色婷婷| 国产欧美日韩精品丝袜高跟鞋| 久久久久久亚洲精品中文字幕| 欧美在线免费视频| 欧美在线观看一区二区三区| 日韩免费在线播放| 一区三区二区视频| 欧美性感美女h网站在线观看免费| 这里只有精品久久| 日韩av免费在线看| 国产主播在线一区| 亚洲成人免费在线视频| 久久久久女教师免费一区| 欧美日韩在线免费观看| 国产精品久久婷婷六月丁香| 国产裸体写真av一区二区| 在线激情影院一区| 日本一区二区三区在线播放| 精品亚洲一区二区三区四区五区| 91精品综合久久久久久五月天| 国产成人中文字幕| 亚洲人成77777在线观看网| 美女撒尿一区二区三区| 成人性生交大片免费观看嘿嘿视频| 黄色一区二区在线观看| 久久精品视频网站| 国产98色在线| 国产91露脸中文字幕在线| 欧美日韩视频在线| 日韩欧美在线免费观看| 日韩大陆欧美高清视频区| 亚洲性69xxxbbb| 日韩精品在线电影| 精品国产乱码久久久久酒店| 91精品免费看| 中文字幕国产精品| 午夜精品久久17c| 中文字幕日韩av综合精品| 久久精品电影一区二区| 国产精品美女视频网站| 欧美性感美女h网站在线观看免费| 欧美人交a欧美精品| 亚洲欧美三级伦理| 亚洲电影免费观看高清| 中文字幕久久亚洲|