Trait修饰器

ES6 Trait 也是一种修饰器,效果与 Mixin 类似,但是提供更多功能,比如防止同名方法的冲突、排除混入某些方法、为混入的方法起别名等等。

下面采用traits-decorator这个第三方模块作为例子。这个模块提供的traits修饰器,不仅可以接受对象,还可以接受 ES6 类作为参数。

  1. import { traits } from 'traits-decorator';
  2. class TFoo {
  3. foo() { console.log('foo') }
  4. }
  5. const TBar = {
  6. bar() { console.log('bar') }
  7. };
  8. @traits(TFoo, TBar)
  9. class MyClass { }
  10. let obj = new MyClass();
  11. obj.foo() // foo
  12. obj.bar() // bar

上面代码中,通过traits修饰器,在MyClass类上面“混入”了TFoo类的foo方法和TBar对象的bar方法。

Trait 不允许“混入”同名方法。

  1. import { traits } from 'traits-decorator';
  2. class TFoo {
  3. foo() { console.log('foo') }
  4. }
  5. const TBar = {
  6. bar() { console.log('bar') },
  7. foo() { console.log('foo') }
  8. };
  9. @traits(TFoo, TBar)
  10. class MyClass { }
  11. // 报错
  12. // throw new Error('Method named: ' + methodName + ' is defined twice.');
  13. // ^
  14. // Error: Method named: foo is defined twice.

上面代码中,TFooTBar都有foo方法,结果traits修饰器报错。

一种解决方法是排除TBarfoo方法。

  1. import { traits, excludes } from 'traits-decorator';
  2. class TFoo {
  3. foo() { console.log('foo') }
  4. }
  5. const TBar = {
  6. bar() { console.log('bar') },
  7. foo() { console.log('foo') }
  8. };
  9. @traits(TFoo, TBar::excludes('foo'))
  10. class MyClass { }
  11. let obj = new MyClass();
  12. obj.foo() // foo
  13. obj.bar() // bar

上面代码使用绑定运算符(::)在TBar上排除foo方法,混入时就不会报错了。

另一种方法是为TBarfoo方法起一个别名。

  1. import { traits, alias } from 'traits-decorator';
  2. class TFoo {
  3. foo() { console.log('foo') }
  4. }
  5. const TBar = {
  6. bar() { console.log('bar') },
  7. foo() { console.log('foo') }
  8. };
  9. @traits(TFoo, TBar::alias({foo: 'aliasFoo'}))
  10. class MyClass { }
  11. let obj = new MyClass();
  12. obj.foo() // foo
  13. obj.aliasFoo() // foo
  14. obj.bar() // bar

上面代码为TBarfoo方法起了别名aliasFoo,于是MyClass也可以混入TBarfoo方法了。

aliasexcludes方法,可以结合起来使用。

  1. @traits(TExample::excludes('foo','bar')::alias({baz:'exampleBaz'}))
  2. class MyClass {}

上面代码排除了TExamplefoo方法和bar方法,为baz方法起了别名exampleBaz

as方法则为上面的代码提供了另一种写法。

  1. @traits(TExample::as({excludes:['foo', 'bar'], alias: {baz: 'exampleBaz'}}))
  2. class MyClass {}

es6 Trait修饰器相关推荐

  1. es6 使用修饰器实现Mixin模式

    使用修饰器实现Mixin模式 在修饰器的基础上,可以实现Mixin模式.所谓Mixin模式,就是对象继承的一种替代方案,中文译为"混入"(mix in),意为在一个对象之中混入另外 ...

  2. es6 使用修饰器实现自动发布事件

    使用修饰器实现自动发布事件 我们可以使用修饰器,使得对象的方法被调用时,自动发出一个事件. const postal = require("postal/lib/postal.lodash& ...

  3. es6 为什么修饰器不能用于函数

    为什么修饰器不能用于函数 ES6 修饰器只能用于类和类的方法,不能用于函数,因为存在函数提升. var counter = 0; var add = function () { counter++; ...

  4. ES6里的修饰器Decorator

    修饰器(Decorator)是一个函数,用来修改类的行为. 一.概述 ES6 引入了这项功能,目前 Babel 转码器已经支持Decorator 首先,安装babel-core和babel-plugi ...

  5. ES6新特性之修饰器

    修饰器(Decorator) 修饰器(Decorator)是一个函数, 用来修改类的行为. ES2017 引入了这项功能, 目前 Babel 转码器己经支持. 使用: <script>@T ...

  6. es6 Babel 转码器对修饰器的支持

    Babel 转码器对修饰器的支持 目前,Babel 转码器已经支持 Decorator. 首先,安装babel-core和babel-plugin-transform-decorators.由于后者包 ...

  7. es6 方法的修饰器

    方法的修饰器 修饰器不仅可以修饰类,还可以修饰类的属性. class Person { @readonly name() { return `${this.first} ${this.last}` } ...

  8. es6 Decorator类的修饰器

    类的修饰器 许多面向对象的语言都有修饰器(Decorator)函数,用来修改类的行为.目前,有一个提案将这项功能,引入了 ECMAScript. @testable class MyTestableC ...

  9. “睡服”面试官系列第二十三篇之修饰器(建议收藏学习)

    目录 1. 类的修饰 2. 方法的修饰 3. 为什么修饰器不能用于函数? 4. core-decorators.js 4.1@autobind 4.2@readonly 4.3@override 4. ...

最新文章

  1. P、NP、NPC问题最通俗的讲解
  2. python @修饰符作用
  3. mysql 逗号 join_关于sql:MySQL中逗号分隔的连接和语法连接有什么区别?
  4. ORACLE获取某个时间段之间的月份列表和日期列表
  5. VIM学习笔记 配置文件(vimrc)
  6. 【clickhouse】ClickHouse表引擎 MergeTree 索引与数据存储方式 一级索引 二级索引
  7. TokuDB存储引擎
  8. Mac OS X 下 TAR.GZ 方式安装 MySQL5.6
  9. 页面间传值的新思路--PreviousPage
  10. 安装原生Win7-SP1重要补丁
  11. 两张图片放在一起有条白线_用photoshop对两幅图无缝拼接后,怎么消除接口那条明显的线?...
  12. 企鹅F4手机外观设计有突破 配MTK6592八核处理器
  13. idea中TKK: 更新 TKK 失败,请检查网络连接
  14. 【BZOJ4316】小C的独立集
  15. 版图提取的spice网表中参数含义及二级效应STI/WPE
  16. 读《巴比伦富翁的理财课》
  17. 利用浏览器的油猴插件下载网页视频
  18. STC8G1K08上电复位时,P30,P31,P32同时为0,程序不能启动。
  19. 算法:“最大公约数” 和 “最小公倍数”
  20. 向着第二层 第一阶段第二十天

热门文章

  1. JavaWeb之Cookie
  2. postfix邮件服务器
  3. 应用程序、虚拟目录、应用程序池
  4. CSS 实现DIV浮动定位不闪
  5. IBM Storwize V7000详解:IIS西安大会现场观察
  6. 3d文件与html结合,js和HTML5怎么结合?
  7. ES 集中式日志分析平台 Elastic Stack(介绍)
  8. Apache Shiro源码解读之SecurityManager的创建
  9. 爬取校园网新闻首页的新闻 使用正则表达式,函数抽离
  10. Android 架构艺术之MVP