国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ECMAScript6(18):Decorator修飾器

tianyu / 1463人閱讀

摘要:修飾器修飾器是提出的一個提案,用來修改類的行為。目前需要才可以使用。其執(zhí)行格式如下是修飾器名,即函數(shù)名相當于修飾器函數(shù)接受個參數(shù),依次是目標函數(shù)屬性名可忽略該屬性的描述對象可忽略。

修飾器

修飾器是 ES7 提出的一個提案,用來修改類的行為。目前需要 babel 才可以使用。它最大的特點是:可以在編譯期運行代碼!其本質(zhì)也就是在編譯器執(zhí)行的函數(shù)。其執(zhí)行格式如下:

@decorator    //decorator 是修飾器名,即函數(shù)名
class A{}
//相當于
class A{}
A = decorator(A) || A;

修飾器函數(shù)接受3個參數(shù),依次是目標函數(shù)、屬性名(可忽略)、該屬性的描述對象(可忽略)。

function test(target){
  target.isTestable = true;               //利用修飾器給類添加靜態(tài)屬性
  target.prototype.isTestable = true;     //利用修飾器給類添加動態(tài)屬性
}

@test
class A{}

console.log(A.isTestable);       //true
console.log(new A().isTestable);   //true

例如之前的 mixin 可以用修飾器實現(xiàn)一個簡單的版本:

function mixins(...list){
  return function(target){
    Object.assign(target.prototype, ...list);
  }
}
var Foo = {
  foo(){console.log("foo");}
};
@mixins(Foo)
class Cla{}
let obj = new Cla();
obj.foo();     //"foo"

修飾器不僅僅可以修飾類,還可以修飾類的屬性和方法:

function readonly(target, name, descriptor){
  descriptor.writable = false;
  return descriptor;
}

class Person{
  constructor(name, age, tel){
    this.name = name;
    this.id = id;
  }
  @readonly
  id(){return this.id};
}

當然也可以同時調(diào)用2個修飾器:

function readonly(target, name, descriptor){
  descriptor.writable = false;
  return descriptor;
}
function nonenumerable(target, name, descriptor){
  descriptor.enumerable = false;
  return descriptor;
}

class Person{
  constructor(name, age, tel){
    this.name = name;
    this.id = id;
  }
  @readonly
  @nonenumerable
  id(){return this.id};
}

使用修飾器應(yīng)該注意:雖然類本質(zhì)是個函數(shù),但修飾器不能用于函數(shù),因為函數(shù)具有聲明提升。

core-decroators.js

這是個三方模塊,使用import {function Namelist} from "core-decroators";引入。它提供了幾個常見的修飾器:

@autobind

是對象中的 this 始終綁定原始對象:

class Person{
  @autobind
  whoami(){
    return this;
  }
}
let person = new Person();
let getPerson = person.getPerson;

getPerson() === person;    //true

@readonly

使得屬性方法只讀

class Person{
  @readonly
  id = gen();     //gen 是一個計數(shù)器
}
var p = new Person()
p.id = 123;   //Cannot assign to read only property "id" of [object Object]

@override

檢查子類方法是否正確的覆蓋了父類的同名方法,如果不正確會報錯

class Person{
  work(){console.log("I am working");}
}
class Coder extends Person{
  @override
  work(){console.log("I am coding");}   //如果不正確會在這里報錯
}

@deprecate(也作: @deprecated)

在控制臺顯示一條 warning,表示該方法不久后將被廢除,接受一個可選的參數(shù)作為警告內(nèi)容, 接受第二個參數(shù)(對象)表示更多信息

class Person{
  @deprecate
  facepalm(){}

  @deprecate("We stopped facepalming")
  facepalmHard(){}

  @deprecate("We stopped facepalming", {url:"http://balabala.com"})
  facepalmHarder(){}
}

@suppressWarnings

抑制 deprecate 修飾器導(dǎo)致調(diào)用 console.warn(), 但異步代碼發(fā)出的除外。

class Person{
  @deprecate
  facepalm(){}

  @supressWarnings
  facepalmWithoutWarning(){
    this.facepalm();
  }
}
let p = new Person();
p.facepalm();    //控制臺顯示警告
p.facepalmWithoutWarning();    //沒有警告
其它第三方修飾器

此外還有一些庫提供一些其他功能,比如 Postal.js(Github)中的 @publish, 可以在函數(shù)調(diào)用時發(fā)布一個事件:

import publish from "../to/decorators/publish";

class FooComponent{
  @publish("foo.some.message", "component")
  someMethod(){}

  @publish("foo.some.other", "")
  anotherMethod(){}
}

再比如 Trait(Github), 和 mixin 功能類似,提供了更強大的功能:防止同名沖突,排除混入某些方法,為混入方法起別名等

import {traits} from "traits-decorator"

class TFoo{
  foo(){console.log("foo1")}
}
class TBar{
  bar(){console.log("bar")}
  foo(){console.log("foo2")}
}

@traits(TFoo, TBar)       //會報錯,因為這兩個類中有同名方法
class MyClass{}

let obj = new MyClass();
//如果沒有第八行的同名方法,輸出如下
obj.foo();   //"foo1"
obj.bar();   //"bar"

但是我們可以修改上面第11行排除這個 foo,讓它可以被覆蓋:

@traits(TFoo, TBar::excludes("foo"))
class MyClass{}

也可重命名同名方法:

@traits(TFoo, TBar::alias(foo:"aliasFoo"))
class MyClass{}

當然綁定運算符可以鏈式調(diào)用:

//假設(shè)還有個同名的 baz 方法
@traits(TFoo, TBar::excludes("foo")::alias(baz:"aliasBaz"))
class MyClass{}

//另一種寫法
@traits(TFoo, TBar::as({excludes: ["foo"], alias: {baz:"aliasBaz"}}))
class MyClass{}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/97439.html

相關(guān)文章

  • ECMAScript6:官方最新Decorator修飾構(gòu)造函數(shù)重寫了。。。

    摘要:改變發(fā)布了最新版本,最新版本的模塊名稱都改成前綴,具體可前往英文官網(wǎng)查看,中文網(wǎng)站文檔尚未更新插件包都已更換名稱,以官網(wǎng)為準,不然會報錯構(gòu)造函數(shù)完全更改,一臉懵逼原先個參數(shù)改為一個對象參數(shù),參數(shù)字段具體如下圖具體查看介紹新的寫法根據(jù)最 改變 babel發(fā)布了最新版本,npm最新版本的模塊名稱都改成@babel前綴,具體可前往babel英文官網(wǎng)查看,中文網(wǎng)站文檔尚未更新 插件 plug...

    王陸寬 評論0 收藏0
  • Python 裝飾使用指南

    摘要:裝飾器是可調(diào)用的對象,其參數(shù)是另一個函數(shù)被裝飾的函數(shù)。第二大特性是,裝飾器在加載模塊時立即執(zhí)行。另一個常見的裝飾器是,它的作用是協(xié)助構(gòu)建行為良好的裝飾器。 裝飾器是可調(diào)用的對象,其參數(shù)是另一個函數(shù)(被裝飾的函數(shù))。 裝飾器基礎(chǔ)知識 首先看一下這段代碼 def deco(fn): print I am %s! % fn.__name__ @deco def func(): ...

    NeverSayNever 評論0 收藏0
  • Python函數(shù)修飾---當方法前遇到@參數(shù)化的修飾方法時發(fā)生的事

    一、前提概念   Python中的函數(shù)是對象。也因此,函數(shù)可以被當做變量使用。 二、代碼模型 以下代碼片段來自于: http://www.sharejs.com/codes/python/8361 # -*- coding: utf-8 -*- from threading import Thread import time class TimeoutEx...

    huashiou 評論0 收藏0
  • PyTips 0x0f - Python 修飾與 functools

    項目地址:https://git.io/pytips Python 的修飾器是一種語法糖(Syntactic Sugar),也就是說: @decorator @wrap def func(): pass 是下面語法的一種簡寫: def func(): pass func = decorator(wrap(func)) 關(guān)于修飾器的兩個主要問題: 修飾器用來修飾誰 誰可以作為修飾器...

    dingding199389 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<