【JS】js面向對象

1、靜態類

無需實例化(即無需用new操作符實化對象)就可以調用的方法就叫靜態方法,
只包含靜態屬性和靜態方法的類叫靜態類,不能被實例化。

	/*
     * 靜態類: 
   * 無需實例化(即無需用new操作符實化對象)就可以調用的方法就叫靜態方法,
     * 只包含靜態屬性和靜態方法的類叫靜態類,不能被實例化。
     */
     //JavaScript對象靜態類示例
     var jsStaticClass = {
         staticAttribute_A: "靜態屬性A",
         staticMethod_A: function () {
             //靜態方法內部可以訪問靜態屬性
             return "靜態方法A," + this.staticAttribute_A + "," + jsStaticClass.staticAttribute_A;
         }
     };
 
     //靜態屬性和方法也可以在外部定義和訪問
     jsStaticClass.staticAttribute_B = "靜態屬性B";
     jsStaticClass.staticMethod_B = function () {
         //靜態方法內部可以訪問靜態屬性
         return "靜態方法B," + this.staticAttribute_A + "," + jsStaticClass.staticAttribute_B;
     };
 
 
     //無需實例化(即無需用new操作符實化對象)就可以調用的方法就叫靜態方法。
     console.log(jsStaticClass.staticAttribute_A);
     console.log(jsStaticClass.staticAttribute_B);
     console.log(jsStaticClass.staticMethod_A());
     console.log(jsStaticClass.staticMethod_B());
 
     //var instance = new jsStaticClass(); //靜態類不能被實例化!

2、靜態屬性和方法

靜態屬性和方法: 
無需實例化(即無需用new操作符實化對象)就可以調用的方法就叫靜態方法。

		/*
     * 靜態屬性和方法: 
   * 無需實例化(即無需用new操作符實化對象)就可以調用的方法就叫靜態方法。
     */
     //JavaScript對象靜態屬性和方法示例
     function JSClass() { };
 
     JSClass.staticAttribute = "靜態屬性";
     JSClass.staticMethod = function () {
         return "靜態方法," + JSClass.staticAttribute;
     };
 
     //無需實例化(即無需用new操作符實化對象)就可以調用的方法就叫靜態方法。
     console.log(JSClass.staticAttribute);
     console.log(JSClass.staticMethod());
 
     /*new一個實例*/
     var instance = new JSClass();
     //instance.staticAttribute; //錯誤!
     //instance.staticMethod(); //錯誤!
     console.dir(instance); //instance實例不可以訪問靜態屬性及方法

3、私有屬性和方法

私有方法:私有方法本身是可以訪問類內部的所有屬性(即私有屬性和公有屬性),但是私有方法是不可以在類的外部被調用。

	/*
     * 私有方法:私有方法本身是可以訪問類內部的所有屬性(即私有屬性和公有屬性),但是私有方法是不可以在類的外部被調用。 
     */
     //JavaScript對象私有屬性,私有方法示例
     function JSClass() {
         //私有變量只有在函數或者對象作用域範圍內能訪問
         var privateAttribute = "私有屬性";
 
         function privateMethod_A() {
             console.log("私有方法A," + privateAttribute);
         };
 
         var privateMethod_B = function () {
             console.log("私有方法B," + privateAttribute);
         };
 
         //私有方法可以在函數作用域範圍內使用。
         privateMethod_A();
         privateMethod_B();
         
         /*
         私有屬性和方法還有個特點:都不能用this訪問。
         下面幾種是不行的:
         this.privateAttribute;
         this.privateMethod_A();
         this.privateMethod_B();
         */
     };
 
     /*new一個實例*/
     var instance = new JSClass();
     console.dir(instance); //instance實例訪問不到私有屬性及私有方法

 4、公有屬性和方法

公有方法:

1.公有方法是可以在類的外部被調用的,

2.但是它不可以訪問類的私有屬性。

3.公有方法必須在類的內部或者外部通過類的prototype屬性添加。

	/*
     * 公有方法: 
   * 1.公有方法是可以在類的外部被調用的; 
   * 2.但是它不可以訪問類的私有屬性;
   * 3.公有方法必須在類的內部或者外部通過類的prototype屬性添加。 
     */
     //JavaScript對象公有屬性,公有方法示例
     function JSClass() {
         //公有變量在函數內或者實例都能訪問
         this.publicAttribute = "公有屬性";
 
         this.publicMethod_A = function () {
             console.log("公有方法A," + this.publicAttribute);
         };
 
         //公有方法可以在類的內部添加
         JSClass.prototype.publicMethod_B = function () {
             console.log("公有方法B," + this.publicAttribute);
         };
 
         //公有方法可以在函數作用域範圍內使用,也可以在函索作用域範圍外使用,可以被實例調用和繼承
         this.publicMethod_A();
         this.publicMethod_B();
 
         /*
         公有屬性和方法有個特點:在內部訪問都必須用this訪問
         下面幾種是不行的:
         publicAttribute;
         publicMethod_A();
         publicMethod_B();
         */
     };
 
     //公有方法也可以在類的外部通過類的prototype屬性添加
     JSClass.prototype.publicMethod_C = function () {
         console.log("公有方法C," + this.publicAttribute);
     };
     
     /*new一個實例*/
     var instance = new JSClass();
     console.log("實例調用公有屬性:" + instance.publicAttribute);
     console.log("實例調用公有方法:" + instance.publicMethod_A());
     console.log("實例調用公有方法:" + instance.publicMethod_B());
     console.dir(instance); //instance實例可以訪問公有屬性及方法
 
     //但是,通過實例添加公有屬性是不行的
     //instance.prototype.publicMethod_D = function () {
     //    console.log("公有方法D," + this.publicAttribute);
     //};

 

5、特權方法

特權方法:

1.特權方法是可以在類的外部被調用的,

2.但是它可以訪問類的私有屬性,並且也是可以訪問類的公有屬性,可以勉強的認爲它是一種特殊的公有方法。

3.但是它與上面的公有方法的聲明與定義方式不同。特權方法必須在類的內部聲明定義。

	/*
     * 特權方法: 
   * 1.特權方法是可以在類的外部被調用的;
   * 2.但是它可以訪問類的私有屬性,並且也是可以訪問類的公有屬性,可以勉強的認爲它是一種特殊的公有方法;
   * 3.但是它與上面的公有方法的聲明與定義方式不同。特權方法必須在類的內部聲明定義。 
     */
     //JavaScript對象特權方法示例
     function JSClass() {
         //私有變量只有在函數或者對象作用域範圍內能訪問
         var privateAttribute = "私有屬性";
         //私有方法
         function privateMethod() {
             console.log("私有方法");
         }
 
         //通過使用this關鍵字定義一個特權方法
         this.privilegeMethod = function () {
             //在特權方法中可以訪問私有屬性和私有方法
             console.log("特權方法," + privateAttribute + "," + privateMethod());
         };
     };
     /*new一個實例*/
     var instance = new JSClass();
     console.log("實例調用特權方法:" + instance.privilegeMethod());
     console.dir(instance); //instance實例可以訪問公有屬性及方法
 
     /*
     * 特權方法瀏覽器兼容支持性很差,避免使用!
     */

特權方法的調用規則
特權方法通過this調用公有方法、公有屬性,通過對象本身調用靜態方法和屬性,在方法體內直接調用私有屬性和私有方法。

公有方法:就是所有通過該類實例化出來的對象,共同都擁有或者說都可以使用的方法。一般把共用的方法,都放在“原型對象“當中,如果放在構造函數中,會重複創建共同的方法。

私有方法:不能在外部調用。
特權方法:利用的閉包原理,即通過作用域鏈,讓內部函數能夠訪問外部函數的變量對象(即該類的私有變量、私有方法)。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章