為什麼需要prototype

2021-06-28 01:22:18 字數 1980 閱讀 3907

1.new object:

var newobj = new object;

newobj.name = "keti";

newobj.color = "red";

newobj.changecolor = function(color)

這種方法看上去很蠢,所以我們找到另一種方法:使用literal直接建立,看上去要優雅得多:

2.literal

var newobj =

}

使用literal來常見物件似乎很不錯,比較直觀,兩個卷括號括起來就是個物件嘛,多清晰明了。但是如果你要建立一系列結構類似的物件,難道要這樣乙個個寫嗎?作為程式設計師我們的遵循的理念就是盡可能減少重複,也就是著名的dry(don't repeat youself)。所以我們是無法容忍這麼愚蠢的事情發生的,因此就有了建構函式,跟類有點相似,但我們這裡不討論類。建構函式就是建立乙個模板,不繫結資料,只提供架構,你只需把相關資料填充到模板裡就可以生成乙個新的物件了:

3.建構函式

function newobj(name,color)

}var newobj1 = new newobj("keti","red");

上面**中,new是乙個構造器,newobj是我們建立好的模板,填入資料,賦給變數newobj1,ok,新的物件就這樣生成了。

到此建立物件的方法似乎已經很不錯了,但仔細觀察我們還發現了新的問題:對於changecolor()這個方法事實上對所有instance來說是相同的,也就是說可以共享,不像name和color那樣需要繫結給每個instance。而建構函式這種形式每次都會把自身的屬性全部copy乙份給每個instance,這就造成了不必要的浪費;並且,當我們想修改這個方法時,就必須重新生成所有的instance才能獲得更新,比如說:

function newobj(name,num)

}var newobj1 = new newobj("kemi",10);

newobj1.changnum(100);

newobj1.num; //很明顯是100

我現在想修改changnum()這個函式:

function newobj(name,num)

}newobj1.changnum(100);

newobj1.num; //依然是100,也就是說這個物件並不受我們修改的模板影響到

怎麼解決這個問題呢?有乙個原型物件。原型物件裡的屬性和方法並不是像建構函式自身屬性一樣copy給每個instance,而是「引用」,也可以理解為給每個instance提供乙個指向該原型物件的指標,這樣每個instance就能找到原型物件裡的屬性,而很明顯,這是一種共享,也就是說,當你修改了這個原型裡的屬性,那麼所有共享該屬性的instance都能獲得這個修改。因此,原型恰好解決了上面提到的兩個問題。

function newobj(name,num)

newobj.prototype.changnum = function(c)

var newobj1 = new newobj("kemi",10);

newobj1.changnum(100);

newobj1.num; //很明顯是100

newobj.prototype.changnum = function(c)//我們重新修改一下這個方法

newobj1.changnum(100);

newobj1.num; //變成200了。

為什麼一般情況下會把屬性直接寫在建構函式內,而方法通過prototype新增呢?這兩種方式的區別上面其實已經有所展現了:大部分的instance的屬性都是不同的,比如說name,因此在建構函式內通過this直接繫結給instance無疑是個好方案,而方法通常是通用的,使用prototype可以讓每個instance共享同乙個方法,而不用每個都copy一次,又能實現實時更新。

為什麼需要PKI

為什麼需要pki 隨著電子商務的迅速發展,資訊保安已成為焦點問題之一,尤其是網上支付和網路銀行對資訊保安的要求顯得更為突出。為了能在網際網路上開展安全的電子商務活動,公開金鑰基礎設施 pki,public key infrastructure 逐步在國內外得到廣泛應用。我們是否真的需要pki,pki...

為什麼需要bootloader

受微控制器和arm7等小型cpu裝置程式設計思維的影響,開始對嵌入式linux和pc中存在bootloader bios的意義有了疑問 bootloader到底有沒有必要存在呢?答案是 大部分情況下是有必要的。首先,bootloader的作用是在硬體商店後執行的第一段軟體 也叫引導引導程式,是在作業...

為什麼需要ALSQL

alsql是乙個通用的資料庫查詢工具。支援多種主流資料庫 alsql支援oracle sql server mysql postgresql sqlite等多種主流的商業資料庫和開源資料庫。支援直連模式 使用直接模式,無需安裝廠商或第三方的資料庫連線驅動,alsql直接連線資料庫,方便快捷,沒有安裝...