es6 Trait修饰器
Trait修饰器
ES6 Trait 也是一种修饰器,效果与 Mixin 类似,但是提供更多功能,比如防止同名方法的冲突、排除混入某些方法、为混入的方法起别名等等。
下面采用traits-decorator这个第三方模块作为例子。这个模块提供的traits
修饰器,不仅可以接受对象,还可以接受 ES6 类作为参数。
import { traits } from 'traits-decorator';
class TFoo {
foo() { console.log('foo') }
}
const TBar = {
bar() { console.log('bar') }
};
@traits(TFoo, TBar)
class MyClass { }
let obj = new MyClass();
obj.foo() // foo
obj.bar() // bar
上面代码中,通过traits
修饰器,在MyClass
类上面“混入”了TFoo
类的foo
方法和TBar
对象的bar
方法。
Trait 不允许“混入”同名方法。
import { traits } from 'traits-decorator';
class TFoo {
foo() { console.log('foo') }
}
const TBar = {
bar() { console.log('bar') },
foo() { console.log('foo') }
};
@traits(TFoo, TBar)
class MyClass { }
// 报错
// throw new Error('Method named: ' + methodName + ' is defined twice.');
// ^
// Error: Method named: foo is defined twice.
上面代码中,TFoo
和TBar
都有foo
方法,结果traits
修饰器报错。
一种解决方法是排除TBar
的foo
方法。
import { traits, excludes } from 'traits-decorator';
class TFoo {
foo() { console.log('foo') }
}
const TBar = {
bar() { console.log('bar') },
foo() { console.log('foo') }
};
@traits(TFoo, TBar::excludes('foo'))
class MyClass { }
let obj = new MyClass();
obj.foo() // foo
obj.bar() // bar
上面代码使用绑定运算符(::)在TBar
上排除foo
方法,混入时就不会报错了。
另一种方法是为TBar
的foo
方法起一个别名。
import { traits, alias } from 'traits-decorator';
class TFoo {
foo() { console.log('foo') }
}
const TBar = {
bar() { console.log('bar') },
foo() { console.log('foo') }
};
@traits(TFoo, TBar::alias({foo: 'aliasFoo'}))
class MyClass { }
let obj = new MyClass();
obj.foo() // foo
obj.aliasFoo() // foo
obj.bar() // bar
上面代码为TBar
的foo
方法起了别名aliasFoo
,于是MyClass
也可以混入TBar
的foo
方法了。
alias
和excludes
方法,可以结合起来使用。
@traits(TExample::excludes('foo','bar')::alias({baz:'exampleBaz'}))
class MyClass {}
上面代码排除了TExample
的foo
方法和bar
方法,为baz
方法起了别名exampleBaz
。
as
方法则为上面的代码提供了另一种写法。
@traits(TExample::as({excludes:['foo', 'bar'], alias: {baz: 'exampleBaz'}}))
class MyClass {}
es6 Trait修饰器相关推荐
- es6 使用修饰器实现Mixin模式
使用修饰器实现Mixin模式 在修饰器的基础上,可以实现Mixin模式.所谓Mixin模式,就是对象继承的一种替代方案,中文译为"混入"(mix in),意为在一个对象之中混入另外 ...
- es6 使用修饰器实现自动发布事件
使用修饰器实现自动发布事件 我们可以使用修饰器,使得对象的方法被调用时,自动发出一个事件. const postal = require("postal/lib/postal.lodash& ...
- es6 为什么修饰器不能用于函数
为什么修饰器不能用于函数 ES6 修饰器只能用于类和类的方法,不能用于函数,因为存在函数提升. var counter = 0; var add = function () { counter++; ...
- ES6里的修饰器Decorator
修饰器(Decorator)是一个函数,用来修改类的行为. 一.概述 ES6 引入了这项功能,目前 Babel 转码器已经支持Decorator 首先,安装babel-core和babel-plugi ...
- ES6新特性之修饰器
修饰器(Decorator) 修饰器(Decorator)是一个函数, 用来修改类的行为. ES2017 引入了这项功能, 目前 Babel 转码器己经支持. 使用: <script>@T ...
- es6 Babel 转码器对修饰器的支持
Babel 转码器对修饰器的支持 目前,Babel 转码器已经支持 Decorator. 首先,安装babel-core和babel-plugin-transform-decorators.由于后者包 ...
- es6 方法的修饰器
方法的修饰器 修饰器不仅可以修饰类,还可以修饰类的属性. class Person { @readonly name() { return `${this.first} ${this.last}` } ...
- es6 Decorator类的修饰器
类的修饰器 许多面向对象的语言都有修饰器(Decorator)函数,用来修改类的行为.目前,有一个提案将这项功能,引入了 ECMAScript. @testable class MyTestableC ...
- “睡服”面试官系列第二十三篇之修饰器(建议收藏学习)
目录 1. 类的修饰 2. 方法的修饰 3. 为什么修饰器不能用于函数? 4. core-decorators.js 4.1@autobind 4.2@readonly 4.3@override 4. ...
最新文章
- P、NP、NPC问题最通俗的讲解
- python @修饰符作用
- mysql 逗号 join_关于sql:MySQL中逗号分隔的连接和语法连接有什么区别?
- ORACLE获取某个时间段之间的月份列表和日期列表
- VIM学习笔记 配置文件(vimrc)
- 【clickhouse】ClickHouse表引擎 MergeTree 索引与数据存储方式 一级索引 二级索引
- TokuDB存储引擎
- Mac OS X 下 TAR.GZ 方式安装 MySQL5.6
- 页面间传值的新思路--PreviousPage
- 安装原生Win7-SP1重要补丁
- 两张图片放在一起有条白线_用photoshop对两幅图无缝拼接后,怎么消除接口那条明显的线?...
- 企鹅F4手机外观设计有突破 配MTK6592八核处理器
- idea中TKK: 更新 TKK 失败,请检查网络连接
- 【BZOJ4316】小C的独立集
- 版图提取的spice网表中参数含义及二级效应STI/WPE
- 读《巴比伦富翁的理财课》
- 利用浏览器的油猴插件下载网页视频
- STC8G1K08上电复位时,P30,P31,P32同时为0,程序不能启动。
- 算法:“最大公约数” 和 “最小公倍数”
- 向着第二层 第一阶段第二十天