gpt4 book ai didi

CoffeeScript 封装和变量访问

转载 作者:行者123 更新时间:2023-12-03 21:23:02 24 4
gpt4 key购买 nike

为了了解 CoffeeScript 实例和类变量的工作原理,我使用了这段代码(结果在评论中)。

class A
x: 1
@y: 2

constructor: (@z) ->
#console.log "const x", x #ReferenceError: x is not defined
console.log "constructor y", @y #undefined
console.log "constructor z", @z # = 3 for A and 6 for B

get: () ->
#console.log "get x", x #ReferenceError: x is not defined
console.log "get y", @y #undefined
console.log "get z", @z # = 3 for A and 6 for B

get2: () =>
#console.log "get2 x", x #ReferenceError: x is not defined
console.log "get2 y", @y #undefined
console.log "get2 z", @z # = 3 for A and 6 for B

@get3: () ->
#console.log "get3 x", x #ReferenceError: x is not defined
console.log "get3 y", @y # = 2
console.log "get3 z", @z #undefined

@get4: () =>
#console.log "get4 x", x #ReferenceError: x is not defined
console.log "get4 y", @y # = 2
console.log "get4 z", @z #undefined

class B extends A
constructor: (@w) ->
super(@w)

console.log '------A------'
i = new A 3
console.log "i.x", i.x # = 1
console.log "i.y", i.y #undefined
console.log "i.z", i.z # = 6
i.get()
i.get2()
A.get3()
A.get4()
console.log '------B------'
i = new B 6
console.log "i.x", i.x # = 1
console.log "i.y", i.y #undefined
console.log "i.z", i.z # = 6
console.log "i.w", i.w # = 6
i.get()
i.get2()
B.get3()
B.get4()
console.log '------------'

这里发生了一些奇怪的事情:
  • x 变量
    我期待从任何方法访问它,但不能从任何方法或构造函数(ReferenceError)访问 x var。我只能从 A 或 B (i.x) 的实例访问它。这是为什么?
  • @y 变量
    我期待从任何方法中获取 @y var 值,但它在大多数地方都没有值(value)(未定义的值,而不是 ReferenceError 异常)。 @y 仅对 @get3 和 @get4 有值(value)(实例方法?)。如果它被定义,为什么我不能得到它的值(value)?
  • @y 和 @z 变量
    @y 和 @z 都是实例变量,但是因为 @z 是在构造函数中初始化的,所以它具有不同的行为。 @y 在@get3 和@get4 上有效,@z 在 get 和 get2 上有效。再说一次,这里发生了什么?

  • 问题是我真的对这些行为感到困惑。这段代码正确吗?那么,我应该多了解CS生成的JS吗?

    Tks

    最佳答案

    在函数体中,@this在类定义中,@指的是类本身而不是原型(prototype)。

    所以在上面的例子中,@y 的定义指A.y , 而不是 A.prototype.y .由于方式this 引用起来比较麻烦受定义方法的各种方式的约束。您可以使用 @y 访问它来自名为 @get 的方法因为在这种情况下 this总是指 A .
    x的定义指A.prototype.x所以从你的get您应该通过 @x 访问它的方法在 get1get2 .

    作为基本指南,尽量不要使用 @在函数体之外,一切都会变得更有意义:

    class A
    constructor: (@a) ->
    b: 2
    tryStuff: =>
    console.log(@a) #will log whatever you initialized in the constructor
    console.log(@b) #will log 2

    编辑 :您可以考虑定义为 @something 的方法成为该类的静态方法,因此您可以使用 classname.something() 调用它们但作为静态方法,它们不能访问任何实例变量。

    关于CoffeeScript 封装和变量访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6551905/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com