2015-08-02 33 views
35

Tôi thấy rằng trang trí của babel.js (có sẵn trong "giai đoạn 1") triển khai thông số tại https://github.com/wycats/javascript-decorators. Có vẻ như các trang trí được giới hạn ở (1) các lớp, (2) người truy cập và (3) phương pháp. Trong trường hợp của tôi, tôi muốn sử dụng trang trí trên đồng bằng cũ chức năng, như trongTrang trí theo chức năng

@chainable 
function foo() { } 

nơi (chỉ là ví dụ)

function chainable(fn) { 
    return function() { 
    fn.apply(this, arguments); 
    return this; 
    }; 
} 

Tôi không thấy bất kỳ lý do hợp lý tại sao trang trí không nên có thể áp dụng cho các chức năng. Câu hỏi của tôi là, có cách nào để thực hiện điều này không? Hoặc có một số lý do chính đáng tại sao các chức năng không thể được trang trí?

Hóa ra có sự cố được nêu ra ở đây là https://github.com/wycats/javascript-decorators/issues/4.

Trả lời

2

Tôi nghĩ rằng vấn đề là trang trí chức năng chưa được ES7 dự thảo.

Tất nhiên, bạn vẫn có thể tự mình thực hiện trang trí chức năng của mình

+0

Bằng cách thực hiện nó bản thân mình, bạn có nghĩa là bằng văn bản của riêng tôi parser/transpiler? –

+0

@torazaburo no, bạn có thể viết một plugin babel –

6

Bạn chắc chắn có một điểm ở đây.

Nhưng như neo_blackcap pointed out, trang trí chức năng không nằm trong số ES7 decorators draft.

Vì vậy, điều tốt nhất bạn có thể làm là start discussion on the corresponding tracker để thu hút sự chú ý của cộng đồng đối với đề xuất của bạn.

Bộ trang trí ES7 nằm trên first stage of development của chúng, có nghĩa là API của chúng vẫn đang được phát triển và có thể trải qua bất kỳ thay đổi nào.

21

Để thực hiện một trang trí, bạn đánh giá một biểu thức và thực hiện điều đó ngăn cản việc kéo (ngay cả đối với một khai báo biến, phía bên tay phải của một phép gán vẫn được đặt). Do đó, nó không tương thích với các khai báo hàm được treo.

Là một công việc xung quanh, tôi gợi ý rằng biểu thức chức năng, biểu hiện chức năng máy phát điện và các chức năng mũi tên có thể được kích hoạt để được trang trí:

const func = @someDecorator('abc') (x, y) => { return x + y }; 

Alas, mà không được đáp ứng với nhiều sự nhiệt tình: https://esdiscuss.org/topic/decorators-for-functions

+1

Thay vì 'const func = @someDecorator ('abc') (x, y) => {return x + y};', tại sao bạn không viết 'const func = someDecorator ('abc') ((x, y) => {return x + y}); '? IMO có thêm một chút cú pháp không thực sự khiến bạn có bất kỳ điều gì trong trường hợp đó. – Ajedi32

+2

+1 cho đề xuất đầu tiên của bạn về các chủ đề về ngăn kéo khi một chức năng được trang trí, fwiw :) – Hrishi

+0

@ Ajedi32: khi có nhiều trang trí, nó đọc tốt hơn nhiều. Hãy xem xét 'decorator1 ('abc') (decorator2 ('def') (decorator3 ('ghi') ((x, y) => ...)))' vs '@ decorator1 ('abc') @ decorator2 (' def ') @ decorator3 (' ghi ') (x, y) => ... '. Gõ rằng phần đầu tiên ra thực sự đã cho tôi dài hơn nó nên để đảm bảo parens đóng là chính xác. –

Các vấn đề liên quan