javascript的私人機制

來源:互聯網
上載者:User

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(...) {...};

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.