Javascript 面向?qū)ο?共有方法,私有方法,特權(quán)方法,靜態(tài)屬性和方法,靜態(tài)類)示例講解

一,私有屬性和方法

私有方法:私有方法本身是可以訪問類內(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>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,513評論 0 21
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,130評論 2 17
  • // 三大特性封裝:隱藏內(nèi)部是吸納,僅開發(fā)接口。繼承:一個對象的成員被另一個對象所使用。語法上體現(xiàn)為代碼的共用。多...
    老夫不才閱讀 978評論 0 1
  • 沒有要說的,怎麼辦
    張可der閱讀 157評論 0 0

友情鏈接更多精彩內(nèi)容