要理解這個,我們首先要理解一個概念“類”,所謂類,指的是對象的模版。對象就是類的實例。由前面我們知道,對象是單個實物的抽象,所以通常需要一個模版,表示某一類實物的共同特征,然后對象根據這個模版生成,這個過程就叫做對象實例化。但是在JS中是沒有“類”這個概念的,而是用構造函數來作為對象模版的,所謂構造函數,指的就是專門生成對象的函數。
兩個相關的概念:
類:比如 人類 (對象的模板、實物的共同特征)
通過關鍵字:new (在JS中是沒有“類”這個概念的,而是用構造函數來作為對象模版的)
實例:比如 王小二 (
那么,王小二的父母孕育他直到出生的過程,就叫:實例化
1 function Human(name){ 2 this.name = name; 3 } 4
5 var wangxiaoer = new Human('王小二'); //這一步叫作 實例化
JavaScript定義的函數為什么得實例化才能用
靜態的成員變量和方法,都是不需要進行實例化類的。可以直接在類上調用進行,不能在類的實例上調用。靜態方法通常用於創建實用程序函數。
非靜態的成員變量和方法,都要進行實例化類的。才可以調用
關於靜態的成員變量和方法的理解:
類(class)通過 static 關鍵字定義靜態方法。不能在類的實例上調用靜態方法,而應該通過類本身調用。這些通常是實用程序方法,例如創建或克隆對象的功能。
靜態變量應該在靜態區分配,不在堆上。每個變量定義的時候只能初始化一次,“初始化”從字面意思理解就是第一次,第二次賦值就不能算了。
就像上面說的,靜態變量的生存期為整個程序,所以只能初始化一次。但是普通局部變量定義一次初始化后當函數結束調用變量就不存在了,再次調用的時候又分配一個變量又可以進行一次初始化。
所以多次調用多次定義了這個變量,從而多次初始化。
棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。
堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。
參考地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Classes/static
function a (){ this.add = function(a,b){ alert(a+b); } } a.add(1,2);// a.add is not a function
var A = new a(); A.add(1,2);//ok
如上,我定義了一個a,想直接調用a去不行,得實例化一個a才能調用其屬性,為什么?