靜態成員js

1、實現類的公有成員:javascript

1)       定義的成員屬性和方法可以被任何實例訪問,對任何的實例都是公開的,成爲公有成員。在javascript中,通常的屬性和方法的定義都是公有的,請看下面的例子:function class1(){java

this.prop=1;app

this.showProp();框架

}函數


//建立一個類的實例this

var obj1=new class1();prototype

class1.prototype.showProp=function(){對象

    alert(this.prop);事件

}ip

2)       以上class1中的屬性,方法都是公共的,屬於任何實例對象。

2、實現類的私有成員:

1)       私有成員便是在內部實現中能夠共享的成員,可是並不對外公開。Javascript中並無特殊的機制來實現私有成員,可是能夠用一些技巧來實現這個功能。

2)       這個技巧主要是經過變量的做用域性質來實現的,在Javascript中,一個函數內部定義的變量稱爲局部變量,該變量不是被函數外的程序訪問,卻能夠被函數內部定義的嵌套函數訪問。在實現私有成員的過程當中,正是利用了這一性質。

3)       在類的構造函數中能夠爲類添加成員,經過這種方式來定義類的成員,實際上共享了構造函數內部定義的局部變量,這些變量就能夠看做爲類的私有成員,例如:

function class1(){

    var pp=」this is a private property」; //私有屬性成員pp,

    function pm(){                         //私有方法成員,顯示pp的值

    alert(pp);

}

this.method1=function(){

    //在公有成員中改變私有屬性的值

    pp=」pp has bean changed」;

}

this.method2=function(){

    pm();         //在公有成員中調用私有方法。

}

}

var obj1=new class1();

obj1.method1();

obj2.method2();

4)       這樣,就實現了私有屬性pp和私有方法pm。運行完class1之後,儘管看上去pp和pm這些局部變量應該隨即消失,但實際上由於class1是經過new來運行的,它所屬的對象尚未消失,因此仍然能夠經過公開成員來對他們進行操做。

5)       要使用私有成員,是以犧牲代碼的可讀性爲代價的。並且這種實現更多的是同樣Javascript技巧,看上去也比較勉強,由於它並非語言自己具備的機制。但種利用變量做用域性質的技巧,倒是值得借鑑的。

3、實現類的靜態成員:

1)       和私有成員的勉強相比,靜態成員顯得「正統」的多。靜態成員屬於一個類的成員,它能夠經過「類名.靜態成員名」的方式訪問。在javascript中,能夠給一個函數對象直接添加成員實現靜態成員,由於函數也是一個對象,因此對象的相關操做,對函數一樣適用。例如:

function class1(){//構造函數

}

//靜態屬性

class1.staticProperty=」sample」;

//靜態方法

class1.staticMethod=function(){

    alert(class1.staticProperty);

}

//調用靜態方法

class1.staticMethod();

2)       經過上面的代碼,就爲類class1添加了一個靜態屬性和靜態方法,而且在靜態方法中引用了該類的靜態屬性。

3)       若是要給每一個函數對象對添加通用的靜態方法,還能夠經過函數對象所對應的類function來實現,例如:

//給類Function添加原型方法:showArgsCount

Function.prototype.showArgsCount=function(){

    alert(this.length); //顯示函數定義的形參的個數

}

function class1(a){

    //定義一個類

}

//調用經過Function的property定義的類的靜態方法showArgsCount

class1.showArgsCount();

4)       因而可知,經過Function的property原型對象,能夠給任何函數都加上通用的靜態成員,這在實際中可起到很大的做用,好比在著名的prototype-1.3.1.js框架中,就給全部的函數定義瞭如下兩個方法:

//將函數作爲一個對象的方法運行

Function.prototype.bind=function(object){

    var _method=this;

    return function(){

    _method.apply(object,arguments);

}

}

//將函數做爲事件鑑聽器

Function.prototype.bindAsEventListener=function(object){

    var _method=this;

    return function(event){

    _mehtod.call(object,event||window.event);

}

}

相關文章
相關標籤/搜索