js實例方法和靜態方法(js實例方法和靜態方法)

本文目錄一覽:

靜態方法和實例方法的區別

靜態方法和實例方法的區別主要體現在兩個方面:

在外部調用靜態方法時,可以使用”類名.方法名”的方式,也可以使用”對象名.方法名”的方式。而實例方法只有後面這種方式。也就是說,調用靜態方法可以無需創建對象。

靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而不允許訪問實例成員變數和實例方法;實例方法則無此限制。

下面幾個例子展示了這一區別。

1、調用靜態方法示例。

//———–hasStaticMethod.java—————–

public class hasStaticMethod{

//定義一個靜態方法

public static void callMe(){

System.out.println(“This is a static method.”);

}

}

下面這個程序使用兩種形式來調用靜態方法。

//———–invokeStaticMethod.java—————–

public class invokeStaticMethod{

public static void main(String args[]){

hasStaticMethod.callMe(); //不創建對象,直接調用靜態方法

hasStaticMethod oa = new hasStaticMethod(); //創建一個對象

oa.callMe(); //利用對象來調用靜態方法

}

} 程序兩次調用靜態方法,都是允許的,程序的輸出如下:

This is a static method.This is a static method.

允許不創建對象而調用靜態方法,是Java為了減少程序員調用某些常用方法時的麻煩,而允許程序員按照傳統的C語言中使用函數的方式來使用方法。典型的例子是前面某些程序中使用”Math.ramdon()”來獲取隨機數。

還有一個很典型的代表就是數組的處理工具Arrays

2、靜態方法訪問成員變數示例。

//———–accessMember.java—————–

class accessMember{

private static int sa; //定義一個靜態成員變數

private int ia; //定義一個實例成員變數

//下面定義一個靜態方法

static void statMethod(){

int i = 0; //正確,可以有自己的局部變數sa = 10;

//正確,靜態方法可以使用靜態變數

otherStat();

//正確,可以調用靜態方法

ia = 20; //錯誤,不能使用實例變數

insMethod(); //錯誤,不能調用實例方法

}

static void otherStat(){}

//下面定義一個實例方法

void insMethod(){

int i = 0; //正確,可以有自己的局部變數

sa = 15; //正確,可以使用靜態變數

ia = 30; //正確,可以使用實例變數

statMethod(); //正確,可以調用靜態方法

}

}

本例其實可以概括成一句話:靜態方法只能訪問靜態成員,實例方法可以訪問靜態和實例成員。之所以不允許靜態方法訪問實例成員變數,是因為實例成員變數是屬於某個對象的,而靜態方法在執行時,並不一定存在對象。同樣,因為實例方法可以訪問實例成員變數,如果允許靜態方法調用實例方法,將間接地允許它使用實例成員變數,所以它也不能調用實例方法。基於同樣的道理,靜態方法中也不能使用關鍵字this。

main()方法是一個典型的靜態方法,它同樣遵循一般靜態方法的規則,所以它可以由系統在創建對象之前就調用。

希望多多交流,多多關注,共同成就夢想

類實例方法,靜態方法的使用與區別

靜態方法是用來操作這個類型的,方法被該類的所有實例共享。

而實例方法用來操作單個實例,不被該類所有實例共享。

靜態方法中不能調用實例方法,也不能訪問實例變數。

實例方法可以調用靜態方法,也能訪問靜態變數。

總之靜態方法對應的是類型,即Class,類。但是實例方法對應的是實例,即object,對象。

javascript中什麼時候用靜態方法什麼時候用實例方法,規則是什麼,各好在哪兒?

script type=”text/javascript”

     /*一、靜態方法和屬性( 類、方法、屬性都為靜態類型; 不能創建實例訪問)*/

      var staticFunc = function(){};

      staticFunc.today = new Date();  //添加靜態屬性

      staticFunc.weather = “sunny”;

      staticFunc.show = function(){ //添加靜態方法

             alert(this.today + ”  weather is ” + this.weather);

      };

     staticFunc.show(); //靜態方法和屬性直接訪問,不能通過實例訪問

     alert(staticFunc.today + ” is ” + staticFunc.weather);

     //new staticFunc().show();  //這裡對staticFunc實例化會導致錯誤,如下圖

     //alert(new staticFunc().today); //這裡也會發生同樣的錯誤

 /*二、普通對象,同時擁有靜態和非靜態屬性、方法

 (可以用實例化 * 注意:1.靜態方法/屬性使用類名訪問  2.非靜態方法/屬性使用實例名訪問 )*/

     function Person(name){

          this.name = name;  //非靜態屬性

          this.showName = function(){ //添加非靜態方法(添加到「類」的實例上)

               alert(“my name is ” + this.name + “.”);

          }

     

          Person.run = function(){  //添加靜態方法(直接添加到「類」上)

               alert(“I am runing… …”);

          }

     }

     /*通過prototype關鍵字添加非靜態屬。每個人的愛好可能不一樣

     【1.具有相同的行為就用靜態方法或屬性,如人類都有一張嘴;2. 具體到每個「類」的每個實體,如每個人的興趣愛好可能不一樣,就用實例方法或屬性】*/

     Person.prototype.hobby = “movie,music,programming,reading.”;

     //添加靜態屬性

     Person.hand = 2;

   

     var me = new Person(“zhangsan”);

     //非靜態方法或屬性必須通過實例來訪問

     me.showName();

     alert(“my hobby has ” + me.hobby);

     //靜態方法必須通過「類」來訪問

     Person.run();

     alert(“I have ” + Person.hand + ” hands.”);

  /script

類方法、實例方法和靜態方法的區別

類方法:

1.類方法只能訪問『類變數』的方法

2.類方法需要使用@classmethod裝飾器定義

3.類方法的第一個參數是類實例,約定寫為cls

說明:

類(實例)和對象(實例)都可以調用類方法,類方法不能調用實例變數

靜態方法:@staticmethod

1.靜態方法是普通函數,靜態方法定義在類的內部,只能憑藉該類或實例調用。

2.靜態方法需要使用@staticmethod裝飾器定義

3.靜態方法寫普通函數定義相同,不需要傳入self和cls參數

說明:

類和實例都可以調用靜態方法

靜態方法不能訪問類變數和實例變數

js代碼如何封裝

1. 定義js類 

js並不是一種面向對向的語言, 沒有提供對類的支持, 因此我們不能像在傳統的語言里那樣 用class來定義類, 但我們可以利用js的閉包封裝機制來實現js類, 我們來封裝一個簡的Shape類. 

代碼如下:

function ShapeBase() { 

    this.show = function(){ 

        alert(“ShapeBase show”); 

    }; 

    this.init = function(){ 

        alert(“ShapeBase init”); 

    }; 

}

這個類里定義了兩個方法:show和init, 需要注意的是這裡用到了this來聲明, 而不是var, 因為用var是用來定義私有方法的. 

另外, 我們還可以用prototype屬性來定義Shape的方法. 

代碼如下:

ShapeBase.prototype.show=function() 

    alert(“ShapeBase show”); 

ShapeBase.prototype.init=function() 

    alert(“ShapeBase init”); 

}

上面這種寫法看起來不太直觀,我們可以將所有的方法寫在一起. 

代碼如下:

ShapeBase.prototype={ 

    show:function(){ 

        alert(“ShapeBase show”); 

    }, 

    init:function() { 

        alert(“ShapeBase init”); 

    } 

};

現在, 類是寫好了, 讓我們寫個js來測試下, 看看結果是不是跟我們想像的一樣呢? 

代碼如下:

function test(src){ 

    var s=new ShapeBase(); 

    s.init(); 

    s.show(); 

}

看到了吧, 其調用方式和C#一模一樣, 而結果也如我們所料. 

到目前為止, 我們學會了如何創建js的類了, 但還只是實例方法,要是實現跟C#中的靜態方法要怎麼做呢? 

其實, 實現js的靜態方法很簡單, 看下面如何實現: 

代碼如下:

//靜態方法 

ShapeBase.StaticDraw = function() 

    alert(“method draw is static”); 

}

2. 實現JS類抽象和繼承 

同樣, js中也不支持類繼承機制,但我們可以通過將父類prototype中的成員方法複製到子類的prototype中來實現. 

和類的繼承一樣,JavaScript也沒有任何機制用於支持抽象類.但利用JavaScript語言本身的性質.可以實現自己的抽象類. 

首先來看看js中的虛方法, 在傳統語言中虛方法是要先定義的, 而包含虛方法的類就是抽象類,不能被實例化,而在JavaScript中,虛方法就可以看作該類中沒有定義的方法,但已經通過this指針使用了. 

和傳統面向對象不同的是,這裡虛方法不需經過聲明,而直接使用了, 並且類也可以被實例化. 

先定義object的extend方法, 一個為靜態方法,一個為實例方法, 這兩個方法用於實現繼承的prototype複製 

代碼如下:

Object.extend = function(destination, source) { 

    for (property in source) { 

    destination[property] = source[property]; 

    } 

    return destination; 

Object.prototype.extend = function(object) { 

    return Object.extend.apply(this, [this, object]); 

}

接下來我們實現一個繼承類Rect, 這裡先用一種簡單的方法來實現。 

代碼如下:

function Rect() { } 

Rect.prototype = ShapeBase.prototype; //只這一句就行了 

//擴充新的方法 

Rect.prototype.add=function() { 

    alert(“Rect add”); 

}

這種方法不能用於重寫,如果改變了show方法, ShapeBase的show也會指向同一函數可能是由於prototype賦值只是簡單的改變指向地址. 

如果上面也定義了: 

Rect.prototype.show=function() { 

    alert(“Rect show”); 

}

那麼執行結果如下: 

function test(){ 

    var s=new ShapeBase(); 

    s.show(); //結果:Rect show 

    var r=new Rect(); 

    r.show(); //結果:Rect show 

    r.add(); 

}

我們再使用object.extend實現繼承, 並實現一個oninit虛方法, 修改ShapeBase如下: 

代碼如下:

ShapeBase.prototype={ 

    show:function() 

    { 

        alert(“ShapeBase show”); 

    }, 

    initialize:function () { 

        this.oninit(); 

    } 

};

實現Rect類繼承. 

代碼如下:

Rect.prototype=(new ShapeBase).extend({ 

  //添加新的方法 

  add:function() { 

    alert(“Rect add”); 

    }, 

    //使用這種方法可以重寫show方法 

    show:function() { 

        alert(“Rect show”); 

    }, 

    //實現虛方法 

    oninit:function() { 

    alert(“Rect oninit”); 

    } 

})

js公有,私有,靜態屬性和方法的區別

html

head

titleJavaScript 對象方法 類方法 原型方法的區別;私有屬性 公有屬性 公有靜態屬性的區別/title

script language=”javascript” type=”text/javascript”

//定義Person類

function Person(name){

//私有屬性MyTime、ID

var MyTime = ” 2010-12-12″;

var ID=”773C0D35-298A-4660-B803-9EADC250ED61″;

//公有屬性MyName

this.MyName = name;

//對象方法(實例化後才能調用) 位置:Person類的內部 語法格式:this.方法名稱 = function([參數…]){ 語句行; }

this.ShowMyName = function() {

alert(“My name is ” + this.MyName + MyTime );

}

//this.Init();

}

//類方法(實際是靜態方法直接調用) 位置:Person類的外部 語法格式:類名稱.方法名稱 = function([參數…]){ 語句行; }

Person.EnglishandFrench = function() {

//訪問靜態屬性 語法格式:類名稱.公有靜態屬性;或者使用語法格式:this.公有靜態屬性;

alert(Person.NAME + ” can speak ” + this.ENGLISH +” and “+ Person.prototype.FRENCH);

}

//原型方法(實例化後調用或者直接調用) 位置:Person類的外部 語法格式:類名稱.prototype.方法名稱 = function([參數…]){ 語句行; }

Person.prototype.ChineseandFrech = function() {

//編寫一個原型方法相當擴充了一個對象方法,稍作變化可複製到類的內部成為一個對象方法;

//訪問公有屬性 語法格式:this.公有屬性;

//訪問公有靜態屬性 語法格式:類名稱.公有靜態屬性;

alert(this.MyName + ” can speak ” + Person.CHINESE + ” and ” + this.FRENCH+”, “+ Person.prototype.FRENCH +” do better.”);

}

//只有原型方法執行後內部擴充到Person類的屬性才能生效

Person.prototype.Init = function() {

//定義公有屬性PersonNo

this.PersonNo = “”;

//定義公有數組屬性 [] 等價於 new Array();它現在是幾維數組或是混合數組要根據賦值後才知道

this.ArrInfo = [];

//定義一個json對象屬性

this.jsonData = {};

}

//公有靜態屬性 位置:Person類的外部

Person.NAME=”Jack”;

Person.ENGLISH=”in english”;

Person.CHINESE=”in chinese”;

//原型屬性(當作公有靜態屬性使用 語法格式:類名稱.prototype.公有靜態屬性;不能使用語法格式:this.公有靜態屬性;)

//原型屬性(當作公有屬性使用 語法格式:類名稱.prototype.公有屬性; 或者使用語法格式:this.公有屬性;)

Person.prototype.FRENCH=”in french”;

var p = new Person(“Rose”);//實例化

p.ShowMyName();

Person.EnglishandFrench();

p.ChineseandFrech();

//ChineseandFrech()當作靜態方法直接調用,請注意 MyName是對象屬性 原型方法內不能調用它

//當作靜態方法直接調用時內部成員必須都是靜態屬性,下面這樣調用是錯誤的;

Person.prototype.ChineseandFrech();

//使用this.Init();這行代碼放在定義Person類內部也一樣初始化

p.Init();

p.PersonNo = “A1B2C3”;

alert(p.PersonNo);

p.ArrInfo[0]=’123′;

alert(p.ArrInfo[0]);

p.ArrInfo[1]=[“111″,”222″,”333”];

alert(p.ArrInfo[1][2]);

p.jsonData = { flash_url : “../swfupload/swfupload.swf”,

custom_settings : {

upload_target : “divFileProgressContainer”

},

debug: false };

alert(p.jsonData.flash_url+” “+p.jsonData.custom_settings.upload_target);

/script

/head

body

divE-mail:zhengzizhi@yahoo.com.cn/div

div盡量將方法定義為原型方法,原型方法避免了每次調用構造函數時對屬性或方法的構造,節省空間,創建對象快./div

/body

/html

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/306997.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-02 18:05
下一篇 2025-01-02 18:05

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • ArcGIS更改標註位置為中心的方法

    本篇文章將從多個方面詳細闡述如何在ArcGIS中更改標註位置為中心。讓我們一步步來看。 一、禁止標註智能調整 在ArcMap中設置標註智能調整可以自動將標註位置調整到最佳顯示位置。…

    編程 2025-04-29
  • 解決.net 6.0運行閃退的方法

    如果你正在使用.net 6.0開發應用程序,可能會遇到程序閃退的情況。這篇文章將從多個方面為你解決這個問題。 一、代碼問題 代碼問題是導致.net 6.0程序閃退的主要原因之一。首…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • 用不同的方法求素數

    素數是指只能被1和自身整除的正整數,如2、3、5、7、11、13等。素數在密碼學、計算機科學、數學、物理等領域都有著廣泛的應用。本文將介紹幾種常見的求素數的方法,包括暴力枚舉法、埃…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • 使用Vue實現前端AES加密並輸出為十六進位的方法

    在前端開發中,數據傳輸的安全性問題十分重要,其中一種保護數據安全的方式是加密。本文將會介紹如何使用Vue框架實現前端AES加密並將加密結果輸出為十六進位。 一、AES加密介紹 AE…

    編程 2025-04-29
  • Python生成隨機數的應用和實例

    本文將向您介紹如何使用Python生成50個60到100之間的隨機數,並將列舉使用隨機數的幾個實際應用場景。 一、生成隨機數的代碼示例 import random # 生成50個6…

    編程 2025-04-29
  • Python學習筆記:去除字元串最後一個字元的方法

    本文將從多個方面詳細闡述如何通過Python去除字元串最後一個字元,包括使用切片、pop()、刪除、替換等方法來實現。 一、字元串切片 在Python中,可以通過字元串切片的方式來…

    編程 2025-04-29

發表回復

登錄後才能評論