首頁  >  文章  >  web前端  >  JavaScript中物件、公有成員、私有成員等基礎概念實例總和

JavaScript中物件、公有成員、私有成員等基礎概念實例總和

伊谢尔伦
伊谢尔伦原創
2017-07-27 11:00:061995瀏覽

JavaScript是建立在物件之上的。陣列(Array)是對象,函數(Function)是對象,而對象(Objects)當然也是對象。那什麼是對象呢?物件是一組「名稱:值」對(name-value pair)的集合。名稱是字串,但值卻可以是字串、數值、布林或物件(包括陣列和函數)。物件通常是用哈希表來實現的,以便可以快速地取值。

如果值是函數,我們就可以把它當作一個「方法」。當物件的一個方法被執行,變數this就被設為物件本身。如此,方法就可以透過this變數來存取物件的實例。

物件可以透過「建構器(constructor)」來建立。構造器是一個擁有初始化物件的函數。構造器提供了類似其他語言中的「類別(class)」所提供的特性和功能,包括靜態變數和方法。

公有

物件的所有成員都是公有成員。任何函數都可以存取、修改或刪除這些成員,當然也可以新增新的成員。將物件新增成員的兩種主要方法:

透過建構器

這種方法一般用來初始化物件實例的公有變數。建構器的this變數被用來為物件新增成員:

function Container(param) {
  this.member = param;
}

建構一個新的物件:

var myContainer = new Container('abc');

然後,公有變數 myContainer.member 就擁有了值 'abc'。

透過原型(prototype)

這種方法通常用來加入公有方法。在物件本身搜尋一個成員但沒有找到時,就使用構造器的原型(prototype)成員。這種原型機制實現了物件導向所謂的 “繼承(inheritance)”,同時也節省了記憶體。給創建自同一個建構器的所有的物件加上一個方法,只需要給建構器的prototype增加一個函數:

Container.prototype.stamp = function (string) {
  return this.member + string;
}

然後我們就可以呼叫這個方法:

myContainer.stamp('def')

返回'abcdef'。

私有

私有(Private)成員是由建構器建立的。通常在建構器中用var宣告的變數和函數參數成為私有成員。

function Container(param) {
  this.member = param;
  var secret = 3;
  var self = this;
}

這個建構器建立了三個私有的實例變數:param,secret和self。

function Container(param) {
  function dec() {
   if (secret > 0) {
     secret -= 1;
     return true;
   } else {
     return false;
   }
  }

  this.member = param;
  var secret = 3;
  var self = this;
}

私有方法dec會檢查實例變數secret,如果它大於0,自減1並回傳true;如果它小於0,則傳回false。這樣就實現了由這個架造器所建立物件的dec函數只能用三次的功能。

按慣例,我們建立了一個私有變數self。私有方法可以透過它來存取到物件本身。但這只是一種權宜之計,因為《ECMAScript Language Specification》中有一個錯誤,使得內部函數的this變數被設定成一個錯誤值。

特權

特權方法是在建構器內部透過this來建立的。

function Container(param) {
  function dec() {
   if (secret > 0) {
     secret -= 1;
     return true;
   } else {
     return false;
   }
  }

  this.member = param;
  var secret = 3;
  var self = this;

  this.service = function () {
   if (dec()) {
     return self.member;
   } else {
     return null;
   }
  };
}

service是一種特權方法。前三次呼叫myContainer.service()將傳回'abc',之後會傳回null。 service透過呼叫私有方法dec來存取私有變數secret。對於其他物件和方法來說,可以存取到service,但不能直接存取到私有的成員。

閉包

這種公有、私有和特權成員模式的存在是由於JavaScript的內在機制:閉包。這意味著一個內部函數永遠可以存取它外部函數的變數和參數,即使外部函數已經回傳。這是JavaScript語言非常強大的特性。目前還沒有關於JavaScript程式設計的書籍展示瞭如何來利用它,它們甚至都沒有提到這一點。

私有和特權成員只能在物件初始化的時候創建,而公有成員可以隨時加入。

模式

公有
function Constructor(...) {
  this.membername = value;
}
Constructor.prototype.membername = value;
私有
function Constructor(...) {
  var self = this;
  var membername = value;
  function membername(...) {...}
}

註:這句程式碼:

function membername(...) {...}

事實上是以下程式碼的簡略寫法

var membername = function membername(...) {...};
特權
function Constructor(...) {
  this.membername = function (...) {...};
}

以上是JavaScript中物件、公有成員、私有成員等基礎概念實例總和的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn