符号(@)在ES6 javascript中有什么作用?(ECMAScript 2015)

Kev*_* Wu 54 javascript reactjs ecmascript-next

我正在查看一些ES6代码,我不明白@符号放在变量前面时的作用.我能找到最接近的东西与私人田地有关?

代码我从redux库中查看:

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)} />
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我发现的关于这个主题的博客文章:https://github.com/zenparsing/es-private-fields

在这个博客文章中,所有示例都在一个类的上下文中 - 在模块中使用符号时它意味着什么?

Kry*_*ten 77

我发现接受的答案还不足以帮我解决这个问题,所以我添加了一些细节来帮助其他人找到这个.

问题是,目前尚不清楚究竟什么是装饰者.给出的示例中的装饰器不仅仅是@符号,它是@connect函数.简单地说,该@connect功能被装饰CounterApp类.

在这种情况下它在做什么?它连接state.counter价值类的道具.请记住,在redux中,该connect函数有两个参数:mapStateToPropsmapDispatchToProps.在这个例子中,它只采用一个参数 - mapStateToProps.

我没有对此进行过多的调查,但这似乎是一种封装你的状态到道具和调度到道具映射的方法,因此它们可以与你的组件相连,而不是位于不同的文件中.


Kit*_*nde 35

这是一个装饰.这是一个被添加到ECMAScript 的提案.有多个ES6和ES5等效示例:https://github.com/wycats/javascript-decorators

装饰器动态地改变函数,方法或类的功能,而不必直接使用子类或更改正在装饰的函数的源代码.

它们通常用于控制访问,注册,注释.


Wil*_*een 8

什么@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
Run Code Online (Sandbox Code Playgroud)