關於JavaScript實例化的理解


 

要理解這個,我們首先要理解一個概念“類”,所謂類,指的是對象的模版。對象就是類的實例。由前面我們知道,對象是單個實物的抽象,所以通常需要一個模版,表示某一類實物的共同特征,然后對象根據這個模版生成,這個過程就叫做對象實例化。但是在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才能調用其屬性,為什么?
 
解答:
A.add(),這種調用方法屬於對象的調用方法。即A是一個對象!而add是只是A函數里的一個方法,他的執行環境是在A函數里。你如果要這樣調用A.add()。
也並不一定要實例化。可以這樣:A.prototype.add = function(){} 這樣add就變成了A對象里的一個屬性。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM