0

なぜこれ...

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これが出力されますか?

{ name: 'Felds' }
my name is 'Felds' and my password is 'initial password'
{ name: 'Bob', password: 'bob\'s password' }

passwordプロパティが に表示されないのはなぜconsole.log fですか? どこに保存され、どのように取得されますか?

4

2 に答える 2

3

'initial password'値は に格納されますPerson.prototype.password。インスタンスPerson.prototype間で共有されるすべての共通属性を持つオブジェクトです。PersonにアクセスするaPersonInstance.passwordと、最初にパスワード プロパティがaPersonInstanceオブジェクトで検索されます。そこに見つからない場合は、そのプロトタイプで検索され、次にそのプロトタイプのプロトタイプで検索されます。

console.log ffのプロトタイプ プロパティは表示されず、自身に格納されているプロパティ (独自のプロパティfとも呼ばれます) のみが表示されます。でボブのパスワードを割り当てると、それ自体に新しいプロパティが作成されます。これは、のプロトタイプにはまだ値がありますが、 にアクセスするための値になります。意味があったことを願っています = Pfb.password = 'bob\'s password'passwordbb.passwordb'initial password'

プロトタイプに格納すること'initial password'で、その値をすべての Person インスタンス間で一種のデフォルト値として共有しています。これは、文字列やその他のプリミティブ (不変) 型を扱う場合にはまったく問題ありません。ただし、配列やその他の変更可能なオブジェクトを使用する場合は、特別な注意が必要です。同じオブジェクトがすべてのクラスのインスタンス間で共有され、そのうちの 1 つがそれを変更する場合、たとえば@someArray.push 5、他のすべてのインスタンスが変更されるためです。それを見るつもりです。@someArray = []そのような場合、各インスタンスが異なる配列/オブジェクト属性を持つことを保証するために、クラス コンストラクターで属性を初期化することをお勧めします。

于 2012-09-12T20:31:58.027 に答える
0

シンプルで迅速な回答を提供したいのですが、Javascriptでは正確ではありません:

passwordで定義した変数class Userは、オブジェクト指向言語のクラス変数User.prototype.passwordのような変数です。のインスタンス変数ではないので、あなたが見ることができません。fconsole.log fpassword

しかし、取得した場合f.passwordでも、値は取得されます'initial password'。インスタンスがそれ自体で変数を見つけることができない場合、そのクラス、つまり でそれを見つけ続けUserます。

b.passwordは のインスタンス変数なbので、コンソールからログアウトできます。

于 2012-09-16T19:14:56.780 に答える