使用 JavaScript 原型時,為什麼一般不將屬性放在原型上宣告?

時間 2021-05-12 05:08:29

1樓:d41d8c

能做是能做,比如「為了節省記憶體」,ES6 曾經規定匿名函式物件沒有 name 屬性,而是用 Function.prototype 的 name 。

Error.prototype 有 name 屬性。

Int8Array 等 typed array 的 prototype 有 BYTES_PER_ELEMENT 唯讀屬性。

但是如其他回答所說,這樣會導致例項之間共享資料,一般用不到。

2樓:吃冬瓜群眾代表

例項方法自不必說,大多都是通用的。比如 Array.prototype.map(),所有的陣列例項的這個方法行為都一樣,完全沒必要掛在陣列例項上。這點這兒不再贅述。

我這兒說下例項屬性。例項屬性是屬於某個例項的,是各例項獨有的屬性。

一來,例項屬性部署在原型上,通常是不符合語義的

就拿你的例子來說,你乙個 Car.prototype,你賦值乙個 redCar,這是什麼意思?難道乙個 greenCar 要先刷成一層紅色,才能再刷成綠色?

當然,作為動態語言,總能找到些反例,但這些反例從邏輯上還是能說得通的。

比如 Boolean.prototype 就持有乙個值為 false 的內部屬性 [[BooleanData]](Internal Slot,方便理解,這兒就叫作內部屬性了),Sring.prototype 就持有乙個值為 "" 的內部屬性 [[StringData]], 他們是 Boolean 或 String 物件。

雖然他們行為的例項相似,但依然不是例項。

再比如,所有的 Error 例項, 都持有乙個 [[ErrorData]] 的內部屬性,用於標記這是乙個 Error 物件, 但是 Error.prototype 就沒有持有這個內部屬性,因為他不乙個錯誤物件,也不具有錯誤的名稱、錯誤的描述什麼的,說他是個錯誤物件不怎麼說的通。

回到你的 Car.prototype,這不是乙個汽車例項, 同樣也不應該設計成乙個汽車物件。

二來,部署在原型在,屬性值可能相互影響,

如果某屬性,例項因為某種原因缺乏該屬性,或者屬性該屬性值是物件,乙個操作不好,屬性值弄的竄來竄去的、雞飛狗跳的就不好了。

比如你的 Car.prototype.carInfo,你就不怕哪個例項發瘋,把原型上的屬性值這個值篡改了?

最後、作為動態語言,很容易找到些反例。

例項的某屬性具有相同的值,或者相同的行為,還是應該部署在原型上的。

比如 String.prototype.constructor,這個屬性就是部署在原型上的,但所有的屬性值都相同,沒有哪個 String 例項的 constructor 屬性不應該返回其建構函式。

再比如 Symbol.prototype.description,這是乙個訪問器屬性,返回該Symbol 的描述,該屬性也是部署在原型上的,因為所有的 Symbol 的這個屬性的行為都是一樣的。

而且,這是乙個 getter 訪問器,setter 缺失,也不會竄到其他值上去,其行為更像是乙個方法。

getSymbol

.prototype

.description()

3樓:折木

屬性也可以這麼做,但最好使用基本型別做屬性值,作為 car 例項共有屬性的預設值。

因為 js 的引用型別預設都是可變引用,如果採用引用型別做原型上的屬性,那對該值內部的修改都會被所有的例項共享。

4樓:hypocrite

這樣的操作當然也是可以的...前提是你清楚知道這樣操作帶來的行為。

屬性不同於方法,一般用例下,類所產生的往往不是單例物件,我們認為屬性應該是由各個物件所持有的屬於自身的狀態,而每個物件所持有的狀態應該彼此之間互不影響,顯然將屬性掛載在原型鏈上雖然滿足了節省空間的需求,但這樣的屬性會被所有的例項物件所共同影響...

而方法往往是用於操縱狀態,定義某一類物件的行為。不具備這種要求「屬於」某個物件的特質,定義在原型鏈上是較為合理的。

5樓:OceanZH

......你把屬性放到 Car 的原型物件上,new 出來的每乙個 car 例項訪問的都是同乙個原型屬性。

這樣每個例項之間的屬性就會互相影響,比如

varcarA

=new

Car()

varcarB

=new

Car()

carA

.carInfo

.carName

='Audi'

carB

.carInfo

.carName

='Benz'

carA

.getCarInfo

()// 'Benz'

carB

.getCarInfo

()// 'Benz'

你覺得這是你想要的嘛?

javascript原型的問題?

yibuyisheng 如果我記得沒錯的話,在ObjectiveC中,對物件成員的訪問被稱為傳送訊息。此處 例項.屬性 的形式在內部也是乙個傳送訊息的過程。也就是說,給例項傳送乙個訊息說 我想訪問你上面的某個屬性!例項收到這個訊息之後,就開始按照原型鏈的屬性查詢規則去查詢相應的屬性,找到就返回相應的...

萬物皆空之 JavaScript 原型

說明你心裡還帶著強烈的傲慢 拒絕承認這正是數千年來進化的最好方式 人只有有了人性,才能組成社會 沒有人性,利益鏈條之中就會缺失最重要的情感利益缺失情感利益,利益博弈就會變得簡單單薄 人際關係就會變成最純粹的簡單利益博弈 社會根本無法產生的 乙個無法產生社會的物種,是不可能君臨食物鏈頂端蹂躪地球上的萬...

Javascript 採用基於原型的物件導向程式設計是出於效能的考慮嗎?

跟效能的關係應該不大。js裡面一切都是物件,類 函式 也是物件,並且都是動態的,任何乙個類都有可能被使用者改動。如果不設計這麼乙個基於prototype的鏈式檢索結構,還能怎麼做?我想不出還有別的好方法可以實現型別系統的同時不損失js的動態靈活性。設想一下js如果使用乙個c 那樣的型別系統,會有多麼...