- 私有變量 在對象内部使用'var'關鍵字來聲明,而且它隻能被私有函數和特權方法通路。
- 私有函數 在對象的構造函數裡聲明(或者是通過var functionName=function(){...}來定義),它能被特權函數調用(包括對象的構造函數)和私有函數調用。
- 特權方法 通過this.methodName=function(){...}來聲明而且可能被對象外部的代碼調用。它可以使用:this.特權函數() 方式來調用特權函數,使用 :私有函數()方式來調用私有函數。
- 公共屬性 通過this.variableName來定義而且在對象外部是可以讀寫的。不能被私有函數所調用。
- 公共方法 通過ClassName.prototype.methodName=function(){...}來定義而且可以從對象外部來調用。
- 原型屬性 通過ClassName.prototype.propertyName=someValue來定義。
- 靜态屬性 通過ClassName.propertyName=someValue來定義。
首先簡單介紹下javascript的對象:在javascript中對象的種類,Object,Function,還有就是内置對象如String,Array,Date等,在
javascript中内置對象都是繼承自Object類。
對象的建立方式
Java代碼
- var obj = new Object(); //傳統的對象 内置對象也是這麼建立的
- var obj = {}; //無類型對象
我們通常使用的函數都是Function類的執行個體. 即我們可以這樣定義一個函數對象
- var add = new Function("a","b","return a+b");
上面的函數對象等同于
- function add(a,b){
- return a+b;
- }
上面這些是很基本的,如果要了解更深大家可以看javascript的書籍,我就不講了。
面說下基于函數的面向對象的 成員和方法的通路域的解釋.
- //構造函數
- function myConstructor(message){
- //公有屬性
- this.myMessage = message;
- //私有屬性
- var separator = '_';
- var myOwner = this;
- //構造函數内私有方法
- function alertMessage(){
- alert(myOwner.myMessage);
- }
- alertMessage();
- //特權方法 可以通路構造函數裡的私有變量
- this.appendToMessage = function(string){
- this.myMessage += separator + string;
- alertMessage();
- }
- //公有方法
- myConstructor.prototype.clearMessage = function(str){
- this.myMessage = "";
- //靜态成員
- myConstructor.name = "jeff";
- //靜态方法
- myConstructor.alertName = function (){
- alert(this.name)
- var obj = new myConstructor("hello !");
- obj.appendToMessage("kate");
這段代碼建立了一個構造函數myConstructor,它本身也是一個Function對象的執行個體。我們在程式中面向對象把它看成構造函數 最後使用的是 myConstructor的執行個體,javascript中沒有類這個概念 ,我們這時候可以把它了解為java中的類
在構造函數中
第1行定義了一個特權屬性myMessage(執行個體對象和子類對象執行個體可以通路)
- //建立子類
- function sub(message){
- //繼承 myConstructor
- myConstructor.call(this,message);
- var subObj = new sub("jame");
- alert(subObj.myMessage);
第2行定義了兩個私有的屬性(在私有方法和特權方法内可以通路,在原型的公有方法不能通路),
第4行定義了一個私有方法alertMessage,接着在構造函數裡調用
最後定義了appendToMessage特權方法(執行個體對象可以通路和子類對象執行個體也可以通路如下)
- subObj.appendToMessage(" hello");
接着定義了公有方法clearMessage是擴充了原型對象,這樣的方法适用于所有new出來的執行個體及子類的執行個體
這裡需要注意的是靜态成員和靜态方法隻能目前的執行個體對象能通路也就是 new myConstructor()的執行個體對象可以通路,在子類中不允許通路.調用如下
- alert(myConstructor.name); //靜态成員
- myConstructor.alertName(); //靜态方法