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