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 f不会显示f的原型属性,只显示f自身存储的属性(也称为自己的f属性)。当您分配 Bob 的密码时,您自己创建了一个新属性,现在将成为 access 的值,即使' 的原型仍然具有该值。我希望这是有道理的 =Pb.password = 'bob\'s password'passwordbb.passwordb'initial password'

通过存储'initial password'在原型中,您将在所有 Person 实例之间共享该值作为一种默认值。这对于字符串或其他原始(不可变)类型来说非常好;但是如果要使用数组或其他可变对象,则必须特别小心,因为相同的对象将在所有类的实例之间共享,并且如果其中一个修改它,例如@someArray.push 5,所有其他的要去看看它。在这些情况下,通常最好在类构造函数中初始化属性,例如@someArray = [],以保证每个实例都有不同的数组/对象属性。

于 2012-09-12T20:31:58.027 回答
0

我想给你一个简单而快速的答案,但在 Javascript 中并不完全正确:

password您定义的变量class UserUser.prototype.password,该变量就像OO语言中的类变量。它不是f实例变量,所以当你console.log f看不到的时候password

但如果你检索f.password,那么你仍然会得到价值'initial password'。当一个实例本身找不到变量时,它会继续在它的类中找到它,即User.

b.password是 in 的实例变量b,因此控制台可以将其注销。

于 2012-09-16T19:14:56.780 回答