Javascript 在CoffeeScript中使用语言助手指定原型属性

Javascript 在CoffeeScript中使用语言助手指定原型属性,javascript,coffeescript,javascript-objects,Javascript,Coffeescript,Javascript Objects,我有一个CoffeeScript代码,这是neo4j的驱动程序代码。因为它有一个类PropertyContainer,它有两个函数get和set,这两个函数被列为语言助手。下面是self和data,它们基本上是这个对象的原型属性。这些可以像a.self和a.data一样访问 我不明白的是,为什么在下面的代码中,他们的前面是一个get和set。get和set在这里清楚地标识了正在读取或写入的属性,但它是如何工作的。在CoffeeScript中,您将原型属性定义为,sprop\u name:->so

我有一个CoffeeScript代码,这是neo4j的驱动程序代码。因为它有一个类
PropertyContainer
,它有两个函数
get
set
,这两个函数被列为语言助手。下面是
self
data
,它们基本上是这个对象的原型属性。这些可以像
a.self
a.data
一样访问

我不明白的是,为什么在下面的代码中,他们的前面是一个
get
set
get
set
在这里清楚地标识了正在读取或写入的属性,但它是如何工作的。在CoffeeScript中,您将原型属性定义为,s
prop\u name:->somecode
,但是如果您将
get prop\u name:->somecode
放入,是否应该将属性名称更改为在
get prop\u name
之后返回的名称。我对咖啡脚本很陌生,所以可能我错过了一些东西。请帮忙

class PropertyContainer

    #
    # Construct a new wrapper around a Neo4j property container with the given
    # data directly from the server at the given Neo4j {GraphDatabase}.
    #
    # @private
    # @param db {GraphDatbase}
    # @param data {Object}
    #
    constructor: (db, data) ->
        @db = db
        @_request = db._request     # convenience alias

        @_data = data or {}
        @_data.self = data?.self or null

    ### Language helpers: ###

    get = (props) =>
        @::__defineGetter__ name, getter for name, getter of props
    set = (props) =>
        @::__defineSetter__ name, setter for name, setter of props

    ### Properties: ###

    #
    # @property {String} The URL of this property container.
    #
    # @todo This might be an implementation detail; should we remove it?
    #   If not, should it at least be renamed to just URL?
    #
    get self: -> @_data.self or null

    #
    # @property {Object} This property container's properties. This is a map
    #   of key-value pairs.
    #
    get data: -> @_data.data or null
    set data: (value) -> @_data.data = value

这实际上是一个基于RESTAPI的Neo4j驱动程序。我认为这与HTTP的GET方法无关。我已经检查了
\uuuuu defineGetter\uuuuu
\uuuuu defineGetter\uuuuu
,除了以类似方式用于其他类之外,在整个库中找不到这些。可能这些是一些CoffeeScript内部原型。如果有人能解释一下,我会很高兴的。再次感谢。

CoffeeScript类是一个函数定义,上面有一堆类的东西。这意味着您可以将任何想要的代码放入类中。因此,如果我们看看这个:

class C
    f = -> #...
    f(6)
然后我们有一个私有函数,
f
,和一个简单的函数调用,
f(6)

现在,如果我们在混合物中添加a:

class C
    f = => #...
然后
f
与类绑定,这样
@
内部
f
将是
C
本身

现在,我们可以将其应用于所讨论的类:

class PropertyContainer
    #...

    get = (props) =>
        @::__defineGetter__ name, getter for name, getter of props
    set = (props) =>
        @::__defineSetter__ name, setter for name, setter of props

    get self: -> @_data.self or null
因此,我们有两个函数,
get
set
,它们在
PropertyContainer
中大量存在,因此
@
内部
get
set
PropertyContainer
。然后调用
get
函数并添加一些括号和大括号以突出显示结构:

get({ self: (-> @_data.self or null ) })
我们应该开始看看发生了什么。
get self…
只是使用对象参数调用
get
函数,该对象有一个值为函数的键(
self

这使得整个
get self…
调用如下所示:

PropertyContainer::__defineGetter__('self', -> @_data.self or null)
那么,如果我们看看什么是:

我们看到,我们只是将
o.self
设置为
o.\u data.self
的访问器别名,以便:

o = new PropertyContainer(...)
o.self
实际上与:

o = new PropertyContainer(...)
o._data.self
或者更一般地说,
get
函数允许您向函数发送简单的属性访问。您还应注意MDN页面中的“符合标准”示例:

// Using the get operator
var o = { get gimmeFive() {return 5}};
console.log(o.gimmeFive); // 5
现在我们看到
get
内部的
PropertyContainer
正在使用非标准的
\uuuu defineGetter\uuu
函数模拟JavaScript


PropertyContainer中的
set
函数类似地模拟了JavaScript。

我找到了一个地方,解释了
\uu定义设置设置设置和
\uu定义设置设置设置的目的,我想我理解了
get
set
只是绑定属性的函数调用
self
data
传递给作为键值参数传递给
get
set
函数的函数。谢谢@mu太短了,解释得很好。
=>
的描述部分非常有用。
// Using the get operator
var o = { get gimmeFive() {return 5}};
console.log(o.gimmeFive); // 5