1. 程式人生 > >es6 方法的修飾器

es6 方法的修飾器

方法的修飾器

修飾器不僅可以修飾類,還可以修飾類的屬性。

  1. classPerson{
  2. @readonly
  3. name(){return`${this.first} ${this.last}`}
  4. }

上面程式碼中,ES6 修飾器readonly用來修飾“類”的name方法。

修飾器函式readonly一共可以接受三個引數。

  1. functionreadonly(target, name, descriptor){
  2. // descriptor物件原來的值如下
  3. // {
  4. // value: specifiedFunction,
  5. // enumerable: false,
  6. // configurable: true,
  7. // writable: true
  8. // };
  9. descriptor.writable =false;
  10. return descriptor;
  11. }
  12. readonly(Person.prototype,'name', descriptor);
  13. // 類似於
  14. Object.defineProperty(Person.prototype,'name', descriptor);

修飾器第一個引數是類的原型物件,上例是Person.prototype,修飾器的本意是要“修飾”類的例項,但是這個時候例項還沒生成,所以只能去修飾原型(這不同於類的修飾,那種情況時target引數指的是類本身);第二個引數是所要修飾的屬性名,第三個引數是該屬性的描述物件。

另外,上面程式碼說明,修飾器(readonly)會修改屬性的描述物件(descriptor),然後被修改的描述物件再用來定義屬性。

下面是另一個例子,修改屬性描述物件的enumerable屬性,使得該屬性不可遍歷。

  1. classPerson{
  2. @nonenumerable
  3. get kidCount(){returnthis.children.length;}
  4. }
  5. function nonenumerable(target, name, descriptor){
  6. descriptor.enumerable =false;
  7. return descriptor;
  8. }

下面的@log修飾器,可以起到輸出日誌的作用。

  1. classMath{
  2. @log
  3. add(a, b){
  4. return a + b;
  5. }
  6. }
  7. function log(target,
    name, descriptor){
  8. var oldValue = descriptor.value;
  9. descriptor.value =function(){
  10. console.log(`Calling "${name}" with`, arguments);
  11. return oldValue.apply(null, arguments);
  12. };
  13. return descriptor;
  14. }
  15. const math =newMath();
  16. // passed parameters should get logged now
  17. math.add(2,4);

上面程式碼中,@log修飾器的作用就是在執行原始的操作之前,執行一次console.log,從而達到輸出日誌的目的。

修飾器有註釋的作用。

  1. @testable
  2. classPerson{
  3. @readonly
  4. @nonenumerable
  5. name(){return`${this.first} ${this.last}`}
  6. }

從上面程式碼中,我們一眼就能看出,Person類是可測試的,而name方法是隻讀和不可列舉的。

下面是使用 Decorator 寫法的元件,看上去一目瞭然。

  1. @Component({
  2. tag:'my-component',
  3. styleUrl:'my-component.scss'
  4. })
  5. exportclassMyComponent{
  6. @Prop() first:string;
  7. @Prop()last:string;
  8. @State() isVisible:boolean=true;
  9. render(){
  10. return(
  11. <p>Hello,my name is{this.first}{this.last}</p>
  12. );
  13. }
  14. }

如果同一個方法有多個修飾器,會像剝洋蔥一樣,先從外到內進入,然後由內向外執行。

  1. function dec(id){
  2. console.log('evaluated', id);
  3. return(target, property, descriptor)=> console.log('executed', id);
  4. }
  5. classExample{
  6. @dec(1)
  7. @dec(2)
  8. method(){}
  9. }
  10. // evaluated 1
  11. // evaluated 2
  12. // executed 2
  13. // executed 1

上面程式碼中,外層修飾器@dec(1)先進入,但是內層修飾器@dec(2)先執行。

除了註釋,修飾器還能用來型別檢查。所以,對於類來說,這項功能相當有用。從長期來看,它將是 JavaScript 程式碼靜態分析的重要工具。

相關推薦

ES6修飾Decorator

類的修飾 許多面向物件的語言都有修飾器(Decorator)函式,用來修改類的行為。 @testable class MyTestableClass { // ... } function testable(target) { target.isTestabl

es6 方法修飾

方法的修飾器 修飾器不僅可以修飾類,還可以修飾類的屬性。 classPerson{@readonly name(){return`${this.first} ${this.last}`}} 上面程式碼中,ES6 修飾器readonly用來修飾“類”的name方法。

ES6學習筆記九:修飾

target ado ret () code targe 使用 rate get 一:修飾器(Decorator)是一個函數,用來修改類的行為。 1)定義與使用 function 修飾器名(target) { //target是被修飾對象,可用target.xxx進行

ES6 -- 修飾

decorator是ES7引入的功能,它是一個函式,用來修改類甚至於是方法的行為。 類的修飾 一個簡單的栗子: @testable class MyTestableClass { // ... } function testable(targ

python兩個關於計算方法執行時間的修飾

import time #import sys #def wrapper( func ): # start = time.time() # func( 50 ) # end = time.time() # print

es6 Babel 轉碼修飾的支援

Babel 轉碼器對修飾器的支援 目前,Babel 轉碼器已經支援 Decorator。 首先,安裝babel-core和babel-plugin-transform-decorators。由於後者包括在babel-preset-stage-0之中,所以改為安裝bab

react-redux的使用採用@connect修飾方法(簡單demo)

如果你採用 react-create-app腳手架話,按以下流程操作 1. npm install eject  彈出配置檔案 2. npm install babel-plugin-transform-decorators-regacy --save-dev 3. 在

java面向對象學習之——java中的類修飾符、成員變量修飾符、方法修飾

16px 實例化 同時 pan 相同 nbsp 激活 fin ati 類修飾符: public(訪問控制符)——>將一個類聲明為公共類,他可以被任何對象訪問,一個程序的主類必須是公共類。abstract——>將一個類聲明為抽象類,沒有實現的方法,需要子類提供方法

python 修飾

修飾器 python 因困擾自己多時,打算整理一下修飾器到底是什麽? 參考資料:http://python.jobbole.com/82344/ 修飾器 1. 定義2個函數 2. 基本實現 3. 問題:實現後, 要修改原來代碼中的變量名, funcB()改為funcA(funcB) 4. 解決方法:

ES6遍歷以及generator函數的說明

內存 gen spa 遍歷 ner 性能 tor es6 計算機 從es5之後,js被各種人玩爛了之後,不得不提起的性能擺在臺面上。可能是這些原因,js把底層的一些更深層的東西都開放出來了。 1.遍歷器 iterator 在了解這個東西之前,需要先了解一下計算機對內存的處理

Java中List集合排序的方法 比較的使用 根據學生對象數序 語文 英語成績總和進行sort排序

private system.in set swift ringbuf 直觀 turn @override encoding package com.swift; import java.util.ArrayList; import java.util.Collecti

ES6遍歷 生成器 學習整理

weight fine ons class fff size efi 生成器 排列 遍歷器[叠代器](Iterator) 就是這樣一種機制。它是一種接口,為各種不同的數據結構提供統一的訪問機制。任何數據結構只要部署 Iterator 接口,就可以完成遍歷操作(即依次處理該數

.NET 簡易方法攔截

parameter hid 接口 tle 說過 inf img 異常 肩膀 偉大的無產階級Willaim曾說過:"無論你覺得自己多麽的了不起,也永遠有人比你更強"。對,我說過!我就是william。 今天想記錄一下在項目中遇到的一個比較有意思的

JS數組去重 ES6 方法

.so sort true index 數組排序 break [] rom array let arr = [0, 0, 0, 0, 1, 2, 3, 4, 4, 5, 2, 3, 3, 3, 9, 8, 9]; //數組去重法1 console.log(Array.f

python函數修飾(decorator)

基於 sig seconds init The put ner 語言 app python語言本身具有豐富的功能和表達語法,其中修飾器是一個非常有用的功能。在設計模式中,decorator能夠在無需直接使用子類的方式來動態地修正一個函數,類或者類的方法的功能。當你希望在不修

修飾-2

return you rom input 執行 per ron swd username import timeuser,passwd = "gx","gx123"def auth(func): def wrapper(*args,**kwargs):

服務數據恢復通用方法+服務分區丟失恢復案例

中心 進行 位置 數據鏡像 過程 指定 結構 數據恢復工具 pro 一、服務器數據恢復背景 本次需要進行數據恢復的服務器為某品牌CX4-480型號服務器,該服務器內共20塊硬組成raid5磁盤陣列;兩個45T的lun。機房管理員對該服務器重裝系統時由於未知原因導致了服務器磁

談談python修飾

rop 無法 屬性。 運算 原函數 cor 層次 設計模式 異常 前言 對python的修飾器的理解一直停留在"使用修飾器把函數註冊為事件的處理程序"的層次,也是一知半解;這樣拖著不是辦法,索性今天好好整理一下關於python修飾器的概念及用法。 介紹

python基礎學習12----修飾

執行 tro 添加 art 一個 def 是否 控制 end 修飾器可以在不修改目標函數代碼的前提下, 在目標函數執行前後增加一些額外功能 例如有一個簡單的函數 import time def func1(): print("這是一個簡單的函數") time.

JavaScript常用數組操作方法,包含ES6方法

作用 comm 增加 來替 em1 === urn nan number 一、concat() concat() 方法用於連接兩個或多個數組。該方法不會改變現有的數組,僅會返回被連接數組的一個副本。 var arr1 = [1,2,3]; var arr2 = [