一,私有屬性和方法
私有方法:私有方法本身是可以訪問類內(nèi)部的所有屬性(即私有屬性和公有屬性),但是私有方法是不可以在類的外部被調(diào)用。?
<script>
/*
? ? * 私有方法:私有方法本身是可以訪問類內(nèi)部的所有屬性(即私有屬性和公有屬性),但是私有方法是不可以在類的外部被調(diào)用。
? ? */
? ? //JavaScript對象私有屬性,私有方法示例
? ? function JSClass() {
? ? ? ? //私有變量只有在函數(shù)或者對象作用域范圍內(nèi)能訪問
? ? ? ? var privateAttribute = "私有屬性";
? ? ? ? function privateMethod_A() {
? ? ? ? ? ? console.log("私有方法A," + privateAttribute);
? ? ? ? };
? ? ? ? var privateMethod_B = function () {
? ? ? ? ? ? console.log("私有方法B," + privateAttribute);
? ? ? ? };
? ? ? ? //私有方法可以在函數(shù)作用域范圍內(nèi)使用。
? ? ? ? privateMethod_A();
? ? ? ? privateMethod_B();
? ? ? ? /*
? ? ? ? 私有屬性和方法還有個特點(diǎn):都不能用this訪問。
? ? ? ? 下面幾種是不行的:
? ? ? ? this.privateAttribute;
? ? ? ? this.privateMethod_A();
? ? ? ? this.privateMethod_B();
? ? ? ? */
? ? };
? ? /*new一個實(shí)例*/
? ? var instance = new JSClass();
? ? console.dir(instance); //instance實(shí)例訪問不到私有屬性及私有方法
</script>
說明:類的構(gòu)造函數(shù)里定義的function,即為私有方法;而在構(gòu)造函數(shù)里用var聲明的變量,也相當(dāng)于是私有變量。(不過類比于c#這類強(qiáng)類型語言中的私有成員概念還是有區(qū)別的,比如無法在非構(gòu)造函數(shù)以外的其它方法中調(diào)用) 。
私有方法
對象的私有方法和屬性,外部是不可以訪問的,在方法的內(nèi)部不是能this調(diào)用對象的公有方法、公有屬性、特權(quán)方法的。
二,公有屬性和方法
公有方法:
1.公有方法是可以在類的外部被調(diào)用的,
2.但是它不可以訪問類的私有屬性。
3.公有方法必須在類的內(nèi)部或者外部通過類的prototype屬性添加。
<spcript>
/*
? ? * 公有方法:
* 1.公有方法是可以在類的外部被調(diào)用的;
* 2.但是它不可以訪問類的私有屬性;
* 3.公有方法必須在類的內(nèi)部或者外部通過類的prototype屬性添加。
? ? */
? ? //JavaScript對象公有屬性,公有方法示例
? ? function JSClass() {
? ? ? ? //公有變量在函數(shù)內(nèi)或者實(shí)例都能訪問
? ? ? ? this.publicAttribute = "公有屬性";
? ? ? ? this.publicMethod_A = function () {
? ? ? ? ? ? console.log("公有方法A," + this.publicAttribute);
? ? ? ? };
? ? ? ? //公有方法可以在類的內(nèi)部添加
? ? ? ? JSClass.prototype.publicMethod_B = function () {
? ? ? ? ? ? console.log("公有方法B," + this.publicAttribute);
? ? ? ? };
? ? ? ? //公有方法可以在函數(shù)作用域范圍內(nèi)使用,也可以在函索作用域范圍外使用,可以被實(shí)例調(diào)用和繼承
? ? ? ? this.publicMethod_A();
? ? ? ? this.publicMethod_B();
? ? ? ? /*
? ? ? ? 公有屬性和方法有個特點(diǎn):在內(nèi)部訪問都必須用this訪問
? ? ? ? 下面幾種是不行的:
? ? ? ? publicAttribute;
? ? ? ? publicMethod_A();
? ? ? ? publicMethod_B();
? ? ? ? */
? ? };
? ? //公有方法也可以在類的外部通過類的prototype屬性添加
? ? JSClass.prototype.publicMethod_C = function () {
? ? ? ? console.log("公有方法C," + this.publicAttribute);
? ? };
? ? /*new一個實(shí)例*/
? ? var instance = new JSClass();
? ? console.log("實(shí)例調(diào)用公有屬性:" + instance.publicAttribute);
? ? console.log("實(shí)例調(diào)用公有方法:" + instance.publicMethod_A());
? ? console.log("實(shí)例調(diào)用公有方法:" + instance.publicMethod_B());
? ? console.dir(instance); //instance實(shí)例可以訪問公有屬性及方法
? ? //但是,通過實(shí)例添加公有屬性是不行的
? ? //instance.prototype.publicMethod_D = function () {
? ? //? ? console.log("公有方法D," + this.publicAttribute);
? ? //};
</script>
公有方法的調(diào)用規(guī)則
調(diào)用公有方法,我們必需先實(shí)例化對象
公有方法中通過不this調(diào)用公有屬性和特權(quán)方法,不能使用this調(diào)用靜態(tài)方法和屬性,必需裁通過對象本身調(diào)用,即對象名。公有方法也不能調(diào)用私有方法。
三,特權(quán)方法
特權(quán)方法:
1.特權(quán)方法是可以在類的外部被調(diào)用的,
2.但是它可以訪問類的私有屬性,并且也是可以訪問類的公有屬性,可以勉強(qiáng)的認(rèn)為它是一種特殊的公有方法。
3.但是它與上面的公有方法的聲明與定義方式不同。特權(quán)方法必須在類的內(nèi)部聲明定義。
<script>
/*
? ? * 特權(quán)方法:
* 1.特權(quán)方法是可以在類的外部被調(diào)用的;
* 2.但是它可以訪問類的私有屬性,并且也是可以訪問類的公有屬性,可以勉強(qiáng)的認(rèn)為它是一種特殊的公有方法;
* 3.但是它與上面的公有方法的聲明與定義方式不同。特權(quán)方法必須在類的內(nèi)部聲明定義。
? ? */
? ? //JavaScript對象特權(quán)方法示例
? ? function JSClass() {
? ? ? ? //私有變量只有在函數(shù)或者對象作用域范圍內(nèi)能訪問
? ? ? ? var privateAttribute = "私有屬性";
? ? ? ? //私有方法
? ? ? ? function privateMethod() {
? ? ? ? ? ? console.log("私有方法");
? ? ? ? }
? ? ? ? //通過使用this關(guān)鍵字定義一個特權(quán)方法
? ? ? ? this.privilegeMethod = function () {
? ? ? ? ? ? //在特權(quán)方法中可以訪問私有屬性和私有方法
? ? ? ? ? ? console.log("特權(quán)方法," + privateAttribute + "," + privateMethod());
? ? ? ? };
? ? };
? ? /*new一個實(shí)例*/
? ? var instance = new JSClass();
? ? console.log("實(shí)例調(diào)用特權(quán)方法:" + instance.privilegeMethod());
? ? console.dir(instance); //instance實(shí)例可以訪問公有屬性及方法
? ? /*
? ? * 特權(quán)方法瀏覽器兼容支持性很差,避免使用!
? ? */
</script>
特權(quán)方法的調(diào)用規(guī)則
特權(quán)方法通過this調(diào)用公有方法、公有屬性,通過對象本身調(diào)用靜態(tài)方法和屬性,在方法體內(nèi)直接調(diào)用私有屬性和私有方法。
公有方法:就是所有通過該類實(shí)例化出來的對象,共同都擁有或者說都可以使用的方法。一般把共用的方法,都放在“原型對象“當(dāng)中,如果放在構(gòu)造函數(shù)中,會重復(fù)創(chuàng)建共同的方法。
私有方法:不能在外部調(diào)用。
特權(quán)方法:利用的閉包原理,即通過作用域鏈,讓內(nèi)部函數(shù)能夠訪問外部函數(shù)的變量對象(即該類的私有變量、私有方法)。
四,靜態(tài)屬性和方法
靜態(tài)屬性和方法:?
無需實(shí)例化(即無需用new操作符實(shí)化對象)就可以調(diào)用的方法就叫靜態(tài)方法。
<script>
/*
? ? * 靜態(tài)屬性和方法:
* 無需實(shí)例化(即無需用new操作符實(shí)化對象)就可以調(diào)用的方法就叫靜態(tài)方法。
? ? */
? ? //JavaScript對象靜態(tài)屬性和方法示例
? ? function JSClass() { };
? ? JSClass.staticAttribute = "靜態(tài)屬性";
? ? JSClass.staticMethod = function () {
? ? ? ? return "靜態(tài)方法," + JSClass.staticAttribute;
? ? };
? ? //無需實(shí)例化(即無需用new操作符實(shí)化對象)就可以調(diào)用的方法就叫靜態(tài)方法。
? ? console.log(JSClass.staticAttribute);
? ? console.log(JSClass.staticMethod());
? ? /*new一個實(shí)例*/
? ? var instance = new JSClass();
? ? //instance.staticAttribute; //錯誤!
? ? //instance.staticMethod(); //錯誤!
? ? console.dir(instance); //instance實(shí)例不可以訪問靜態(tài)屬性及方法
</script>
靜態(tài)方法的調(diào)用規(guī)則
使用靜態(tài)方法時(shí),無需實(shí)例化對象,便可以調(diào)用,對象實(shí)例不能調(diào)用對象的靜態(tài)方法,只能調(diào)用實(shí)例自身的靜態(tài)屬性和方法。
五,靜態(tài)類
靜態(tài)類:?
無需實(shí)例化(即無需用new操作符實(shí)化對象)就可以調(diào)用的方法就叫靜態(tài)方法,
只包含靜態(tài)屬性和靜態(tài)方法的類叫靜態(tài)類,不能被實(shí)例化。
<script>
/*
? ? * 靜態(tài)類:
* 無需實(shí)例化(即無需用new操作符實(shí)化對象)就可以調(diào)用的方法就叫靜態(tài)方法,
? ? * 只包含靜態(tài)屬性和靜態(tài)方法的類叫靜態(tài)類,不能被實(shí)例化。
? ? */
? ? //JavaScript對象靜態(tài)類示例
? ? var jsStaticClass = {
? ? ? ? staticAttribute_A: "靜態(tài)屬性A",
? ? ? ? staticMethod_A: function () {
? ? ? ? ? ? //靜態(tài)方法內(nèi)部可以訪問靜態(tài)屬性
? ? ? ? ? ? return "靜態(tài)方法A," + this.staticAttribute_A + "," + jsStaticClass.staticAttribute_A;
? ? ? ? }
? ? };
? ? //靜態(tài)屬性和方法也可以在外部定義和訪問
? ? jsStaticClass.staticAttribute_B = "靜態(tài)屬性B";
? ? jsStaticClass.staticMethod_B = function () {
? ? ? ? //靜態(tài)方法內(nèi)部可以訪問靜態(tài)屬性
? ? ? ? return "靜態(tài)方法B," + this.staticAttribute_A + "," + jsStaticClass.staticAttribute_B;
? ? };
? ? //無需實(shí)例化(即無需用new操作符實(shí)化對象)就可以調(diào)用的方法就叫靜態(tài)方法。
? ? console.log(jsStaticClass.staticAttribute_A);
? ? console.log(jsStaticClass.staticAttribute_B);
? ? console.log(jsStaticClass.staticMethod_A());
? ? console.log(jsStaticClass.staticMethod_B());
? ? //var instance = new jsStaticClass(); //靜態(tài)類不能被實(shí)例化!
</script>