簡體   English   中英

繼承與coffeescript

[英]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定義的變量passwordUser.prototype.password ,該變量就像OO語言中的類變量一樣。 它不是f的實例變量,因此當您console.log f時,您看不到password

但是,如果您檢索f.password ,那么您仍然會獲得'initial password'值。 當實例本身無法找到變量時,它將繼續在其類(即User找到它。

b.passwordb的實例變量,因此控制台可以注銷它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM