0

CoffeeScript Ristretto看以下内容:

QueueMaker = ->
  do (queue = undefined) ->
    array: []
    head: 0
    tail: -1
    pushTail: (value) ->
      queue.array[tail += 1] = value
    pullHead: ->
      unless queue.isEmpty()
        do (value = queue.array[queue.head]) ->
          queue.array[queue.head] = undefined
          queue.head += 1
          value
      isEmpty: ->
        queue.tail < queue.head

可以变异queue.head- http://jsfiddle.net/VQLNG/

queue = QueueMaker()
queue.head = 666
console.log queue

我怎样才能编写上面的函数以便head不公开?

4

3 回答 3

1

JavaScript 没有私有属性,所以 CoffeeScript 也没有。

但是,在许多情况下,您可以通过使用函数作用域来隐藏事物和使用闭包来访问隐藏的事物来模拟私有属性。

一个简单的堆栈实现应该演示该技术:

Stack = ->
    stack = [ ]
    push: (e) -> stack.push(e)
    pop:      -> stack.pop()
    toArray:  -> stack.slice()

stackStack函数中的局部变量,因此无法从外部访问或看到它Stackpushand函数只是对数组的代理,而函数pop是查看外观的唯一方法。只有这三个函数可以访问,所以它实际上是私有的,每次调用时,都会得到一个新的 local 。stacktoArraystackstackStackstack

演示:http: //jsfiddle.net/ambiguous/C8V5R/

调整您的队列以使用此技术隐藏arrayhead并将tail其留作练习。

于 2014-05-24T21:25:11.433 回答
0

的返回值QueueMaker是一个 JavaScript 对象,head是它的字段之一。对象字段是可变的,没有受保护状态的选项。

即使QueueMaker重写为 CoffeeScript 类,并且 head 是一个实例变量,它仍然在对象范围之外是可变的。

CoffeeScript 只能支持 JavaScript 的语言级特性,不支持私有/受保护的关键字。可悲的是。

于 2014-05-24T20:58:42.057 回答
0
于 2014-05-25T21:14:40.317 回答