[英]Inheritance with coffeescript
為什么這個...
class Person
name: "initial name"
constructor: (@name) ->
class User extends Person
password: "initial password"
f = new User "Felds"
console.log f
console.log "my name is '#{f.name}' and my password is '#{f.password}'"
b = new User "Bob"
b.password = "bob's password"
console.log b
...通過coffee -p test.coffee | node
運行時coffee -p test.coffee | node
coffee -p test.coffee | node
輸出此?
{ name: 'Felds' }
my name is 'Felds' and my password is 'initial password'
{ name: 'Bob', password: 'bob\'s password' }
為什么password
屬性未顯示在console.log f
? 它存儲在哪里以及如何檢索?
'initial password'
值存儲在Person.prototype.password
。 Person.prototype
是一個在Person
實例之間共享所有通用屬性的對象。 當您訪問aPersonInstance.password
,首先在aPersonInstance
對象中查找password屬性。 如果沒有找到,將在其原型中查找,然后在其原型中查找,依此類推。
console.log f
將不會顯示f
的原型屬性,只會顯示f
本身存儲的屬性(也稱為f
自身的屬性)。 當使用b.password = 'bob\\'s password'
分配Bob的密碼時,您將在b
本身中創建一個新的password
屬性,即使b
的原型仍然具有b.password
,該屬性也將成為訪問b.password
的值。 'initial password'
值。 我希望這有道理= P
通過在原型中存儲'initial password'
,您可以在所有Person實例之間共享該值作為一種默認值。 這對於使用字符串或其他原始(不可變的)類型是非常好的。 但是如果要使用數組或其他可變對象,則必須格外小心,因為同一個對象將在所有類的實例之間共享,並且如果其中之一被修改,例如@someArray.push 5
,其他所有對象都將看到它。 在這種情況下,通常最好在類構造函數中初始化屬性,例如@someArray = []
,以確保每個實例將具有不同的數組/對象屬性。
我想給ua一個簡單快速的答案,但在Javascript中不完全正確:
您在class User
定義的變量password
是User.prototype.password
,該變量就像OO語言中的類變量一樣。 它不是f
的實例變量,因此當您console.log f
時,您看不到password
。
但是,如果您檢索f.password
,那么您仍然會獲得'initial password'
值。 當實例本身無法找到變量時,它將繼續在其類(即User
找到它。
b.password
是b
的實例變量,因此控制台可以注銷它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.