我正在查看一些ES6代码,并且我不明白@符号放在变量前面时的作用。我能找到的最接近的事情与私人领域有关吗?
我正在从redux library:
查看代码import React, { Component } from 'react';
import { bindActionCreators } from 'redux';
import { connect } from 'redux/react';
import Counter from '../components/Counter';
import * as CounterActions from '../actions/CounterActions';
@connect(state => ({
counter: state.counter
}))
export default class CounterApp extends Component {
render() {
const { counter, dispatch } = this.props;
return (
<Counter counter={counter}
{...bindActionCreators(CounterActions, dispatch)} />
);
}
}
以下是我在该主题上发现的博文:https://github.com/zenparsing/es-private-fields
在这篇博客文章中,所有示例都在一个类的上下文中 - 在模块中使用符号时它意味着什么?
答案 0 :(得分:72)
我发现接受的答案不足以帮助我解决这个问题,所以我要添加一些细节来帮助其他人找到这个。
问题在于,目前还不清楚 是装饰器。给出的示例中的装饰器不仅仅是@
符号,而是@connect
函数。简单地说,@connect
函数装饰 CounterApp
类。
在这种情况下它在做什么?它是将state.counter
值连接到类的道具。请记住,在redux中,connect
函数有两个参数:mapStateToProps
和mapDispatchToProps
。在这个例子中,它只采用一个参数 - mapStateToProps
。
我没有对此进行太多调查,但这似乎是一种封装你的状态到道具和调度到道具映射的方法,因此它们可以伴随你的组件,而不是位于不同的文件中。
答案 1 :(得分:35)
这是装饰者。将提案添加到ECMAScript中。在https://github.com/wycats/javascript-decorators
上有多个ES6和ES5等效示例装饰器动态地改变函数,方法或类的功能,而不必直接使用子类或更改正在装饰的函数的源代码。
它们通常用于控制访问,注册和注释。
答案 2 :(得分:4)
@myDecorator()
? javascript中的@
符号代表装饰器。 ES6
中不存在装饰器,因此您与装饰器一起使用的in代码可能已转换为可以在任何浏览器中运行的javascript版本。
修饰器可以动态扩展(即修饰)对象的行为。在运行时添加新行为的能力由Decorator对象完成,该对象将自身“包裹”在原始对象周围。装饰器不仅仅是javascript中的概念。这是在所有面向对象的编程语言中使用的设计模式。这是维基百科的定义:
在面向对象的编程中,装饰器模式是一种设计 模式,允许将行为添加到单个对象, 动态,而不会影响其他对象的行为 同班。装饰器模式通常有助于遵守 单一责任原则,因为它允许功能 在各个具有独特关注领域的班级之间进行划分
使用装饰器时,可以在运行时修改对象的功能。例如,在您的代码中,您只需导入装饰器并将其添加到您的CounterApp
类中。现在,您的CounterApp
已动态添加了功能您不知道实现细节。
// decorator lights is a function which receives the class as an argument
let lights = function(tree) {
// The behaviour of the class is modified here
tree.treeLights = 'Christmas lights'
}
@lights // the decorator is applied here
class ChristmasTree {}
console.log(ChristmasTree.treeLights); // logs Christmas lights