問題:你已將發現了可復用的功能,並且建立乙個物件,將該功能定義為物件的方法。然而還需要新增對私有資料成員的支援
解決方案:確保乙個資料成員不會暴露給公共訪問的一種方法是,將該物件從新定義為乙個函式,它帶有公開暴露的方法,或者帶有使用私有資料或方法的資料物件。
例如我們對下列物件改寫,新增對私有資料成員的支援
var clobject = else
if(document.defaultview && document.defaultview.getcomputedstyle)
return
undefined;
},getelem:function
(id),
stripslashes:function
(str),
removeanglebrackets:function
(str)
}console.log(clobject.tostring());
console.log(clobject.removeanglebrackets("yes>no<=no"));
簡單的函式到物件的轉換,在全域性命名空間上要比在單個函式上容易,然而這種性質的一次性物件也有缺點,包括不能新增可供所有物件方法訪問的私有資料。
有一種方法將物件轉化為宣告的函式並且**所有方法,使用this。
//不能新增私有變數
var ownobject = ,
}console.log(ownobject.name);
//使用this 將物件轉化為宣告函式,暴露方法但是不暴露私有資料變數
function
ownfuntion()}
var obj = new ownfuntion();
console.log(obj.name);//因為是私有變數所以不能在外部訪問到,輸出undefined
console.log(obj.getname());//gray,暴露的方法來訪問內部的私有資料變數
還有一種更高效優雅的方法,就是使用iief來封裝物件的方法和資料。這種方法建立了乙個單體,就是乙個單個的物件,而不是例項化的物件,它還允許我們使用乙個函式或乙個物件作為庫物件的核心。
與簡單物件相比其主要差異在於:
+ 單體實現在init()中建立,當呼叫getinstance()函式的時候會呼叫init方法,如果該例項已經存在,則返回最初已經存在的例項,如果沒有就建立乙個新的例項,
var clsingleton = (function
(), stripslashes:function
(str),
removeanglebrackets:function
(str)};}
return
return instance;}};
})();
var clcb = clsingleton.getinstance();
var clcb2 = clsingleton.getinstance();
console.log(clcb ===clcb2);//true
console.log(clcb.removeanglebrackets("yes>no<=no"));//yes>no<=no
類的私有資料成員的訪問
類的私有資料成員智慧型在類體哪被訪問,不能夠在類體外通過物件名直接訪問,考察下面的類 class point1 point1 point1 point1 point1 void point1 setpoint int x,int y,int z void point1 display 執行結果 12...
給ctags新增對Elixir的支援
ctags 官方已經許久未更新了,截至本文寫作時止,最後一次更新在 2009 07 09,所以很多新出的語言都沒能得到支援 現在 github 上有乙個 fork 出來的專案叫 universal ctags,它拾起了對 ctags 的更新,但是很遺憾,elixir 也暫未得到支援 好在 ctags...
對類裡成員函式返回私有資料成員的操作
對類裡面的私有指標,自己犯這樣的錯誤 1 對返回指標直接賦值 god.return pointer change n 當然這樣編譯器會報錯。2 妄想通過別的指標賦值 char p god.return pointer p change n 這樣私有成員指標當然沒有被改變到。確做法應該是增加乙個 vo...