javascript中的私人成員
翻譯的外文,有些不對的地方請留言,謝謝
javascript是世界上最令人誤解的程式設計語言。有些程式員認為它缺少隱藏資訊的屬性因為javascript中的對象不能有私人的實體變數和方法。但是真正瞭解javascript這門語言的知道,javascript中的對象是可以含有私人的成員。
下面詳細的展開介紹。
對象 Objects
Javascript是基於對象的語言。數組是對象,函數也是對象,可以說,一切都是對象。那什麼是對象呢?對象是名值對的集合。變數名的類型是字串,變數實值型別可以是字串類型,數實值型別,布爾型,和對象(包括數組和函數)。對象通常實現的時候可以看作是雜湊表,所以變數值可以快速的檢索出來。
如果一個變數是一個函數,我們可以對其進行設定,讓這個函數包含一個方法。當一個對象的方法被調用的時候,this這個變數可以綁定這個對象。這個對象的方法可以通過this快速的訪問對象的成員。
對象是通過構造器來產生,構造器是函數並且可以初始化對象。構造器和其他語言中的類很相似,包括靜態變數和方法。
公有 Public
一個對象的成員都是公有的成員。任何的函數都可以訪問,修改,刪除對象的成員,對對象增加新的成員。下面兩種方法,展示對一個新構造的對象設定成員。
1通過構造器 In he constructor
這種方法通常用來初始化公有的執行個體變數。構造器的this對新構造的對象新增成員。
function Container(param)
{
this.member = param;
}
然後,我們構造一個對象
var myContainer = new Container('abc');
顯然,對象 myContainer.member 包含'abc'.
例子:一個公有的方法service
公有的方法是可以訪問私人的變數和方法,它自己也是可以訪問公有的成員和被外界訪問。刪除或取代一個免責方法是有可能的,但是不可能去改變它或者強制免責方法放棄它的隱私。
function Container(param)
{
function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
this.member = param;
var secret = 3;
var that = this;
this.service = function () {
if (dec()) {
return that.member;
} else {
return null;
}
};
}
service是一個公有方法。起先三次調用myContainer.service() 將會返回"abc",之後將會返回null。service調用私人的dec方法,dec函數可以訪問私人的sercet變數。service是可以供其他對象使用的方法,但是其他對象不允許直接調用私人成員。
2 通過原型 In the prototype
這種技術通常對構造器添加公有的方法和變數。當一個成員被尋找,但是沒有在對象自身中找到,可以順著構造器的原型來進行尋找。原型的原理是用來實現繼承的功能。它通常儲存著記憶。原型添加一個方法,所有的對象都可以進行訪問。
Container.prototype.stamp = function (string)
{
return this.member + string;
}
現在,我們可以調用這個方法
myContainer.stamp('def')
輸出 'abcdef'.
私人 Private
私人成員也是通過構造器來實現的。構造器普通的變數和參數變成了私人的成員。
function Container(param)
{
this.member = param;
var secret = 3;
var that = this;
}
構造器設定了兩個私人的執行個體變數:secret, and that ,他們綁定在對象上,但是他們不允許訪問外界,同時不允許外界訪問這兩個私人變數。
下面的例子:私人的方法是構造器內建函式
function Container(param)
{
function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
this.member = param;
var secret = 3;
var that = this;
}
私人的方法dec檢測secret這個執行個體變數。如果其大於0,則secret自身會減去1,然會返回true。否則會返回false。
按照慣例,我們設定了一個私人的that變數。這可以讓對象利用私人的方法。這是ECMAScript 語言規範中的一個error,這個error會引起this錯誤的設定內部的函數。
閉包 Closures
公有,私人的模式是可以實現的因為javascript有閉包的存在。閉包定義:閉包是一個內嵌的函數通常可以訪問外部函數的變數和參數,即使外部函數已經返回。這是javascript一種強大的功能。
私人的成員只有一個對象被構造的時候才可以被創造。公有的成員任何時候都是可以添加的。
模式 Patterns
公有 Public
function Constructor(...)
{
this.membername = value;
}
Constructor.prototype.membername = value;
function Constructor(...)
{
this.membername = function (...) {...};
}
私人 Private
function Constructor(...)
{
var that = this;
var membername = value;
function membername(...) {...}
}
注釋:函數的聲明
function membername(...) {...}
可以簡寫為
var membername = function membername(...) {...};