gpt4 book ai didi

javascript - 在 CoffeeScript 中使用语言助手来分配原型(prototype)属性

转载 作者:行者123 更新时间:2023-11-28 01:42:12 25 4
gpt4 key购买 nike

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

我不明白的是为什么在下面的代码中,它们之前是 getsetgetset 清楚地标识了该属性正在被读取或写入,但它是如何工作的。在 CoffeeScript 中,您将原型(prototype)属性定义为 prop_name: -> somecode 但如果您输入 get prop_name: -> somecode ,这不应该将属性名称更改为以下内容:在获取 prop_name 后返回。我对 CoffeeScript 很陌生,所以也许我错过了一些东西。请帮忙。

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

这实际上是一个基于 REST API 的 Neo4j 驱动程序。我认为这与HTTP的GET方法没有任何关系。我已经检查了 __defineGetter____defineSetter__,这些在整个库中都看不到,除非以类似的方式用于其他类。这些可能是一些 CoffeeScript 内部原型(prototype)原型(prototype)。如果有人能阐明这一点,我会很高兴。再次感谢。

最佳答案

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

class C
f = -> #...
f(6)

然后我们有一个私有(private)函数,f ,以及一个简单的函数调用 f(6) .

现在如果我们添加 => 混合中:

class C
f = => #...

然后f绑定(bind)到该类,以便 @里面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

所以我们有两个函数,getset ,其中有大量 PropertyContainer这样@里面getsetPropertyContainer 。然后我们调用get函数并添加一些括号和大括号以突出显示结构:

get({ self: (-> @_data.self or null ) })

我们应该开始看看发生了什么。 get self ...只需调用 get带有对象参数的函数,该对象有一个键( self ),其值是一个函数。

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

PropertyContainer::__defineGetter__('self', -> @_data.self or null)

然后如果我们看看 __defineGetter__ 是:

// Non-standard and deprecated way
var o = {};
o.__defineGetter__("gimmeFive", function() { return 5; });
console.log(o.gimmeFive); // 5

我们看到我们刚刚设置 o.self作为 o._data.self 的访问器别名这样:

o = new PropertyContainer(...)
o.self

实际上与:

相同
o = new PropertyContainer(...)
o._data.self

或者更一般地说,get function 允许您向函数发送简单的属性访问。您还应该注意 MDN 页面中的“符合标准”示例:

// Using the get operator
var o = { get gimmeFive() {return 5}};
console.log(o.gimmeFive); // 5

现在我们看到 get里面PropertyContainer正在模拟 JavaScript 的 get operator使用非标__defineGetter__功能。

set里面的功能PropertyContainer类似地模拟 JavaScript 的 set operator .

关于javascript - 在 CoffeeScript 中使用语言助手来分配原型(prototype)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20789308/

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