장식사의 다른 출처: 지겨움:

4509 단어 javascript-decorators

묘사

안녕하세요.
나는 다른 출처를 찾아 장식사를 알아보고 있다.물론 decorators의 official proposal 부분에 대해 이 점을 연결한 것은 좋지만, 이 안내서는 주석을 이해하고 자바스크립트에서의 응용/외관만 보고 싶은 사람들에게만 적용되는 것으로 나타났다.
예컨대
class Person {
  @readonly
  name() { return `${this.first} ${this.last}` }
}
@readonly 선언/정의는 어디에 있습니까?JavaScript 해석기가 알아야 할 기본 명령입니까 아니면 사용자 정의 명령입니까?후자라면 가능한 실시 방안은 무엇입니까?
또한 name()는 하나의 방법이기 때문에 제작readonly의 목적은 다음과 같다.
let p = new Person(...)
p.name = /* another method | proxy method | undefined */
?

토론 #1

decorator는 역할 영역에 필요한 사용자 정의 함수입니다.i, e. 동일한 범위 내에서 또는 import에서 정의합니다.권장되는 내장 장식기가 없습니다.
자술문서는 확실히 몇 가지 예를 제시했고, 그것들이 어떻게 일을 하는지 설명했다.@readonly의 경우 설명서의 @nonenumerable를 예로 들어 설명자를 .writable = false로 표시할 수 있습니다.
Demo Using Babel.js
function readonly(target, key, descriptor) {
  descriptor.writable = false;
  return descriptor;
}

class Person {
  @readonly
  name() { return `${this.first} ${this.last}` }
}

var dudebro = new Person();
dudebro.name = 'Biblo Baggins';
// Cannot assign to read only property 'name' of [object Object]

토론 #2

decorator(사용Babel.js 전송)를 시작한 기존 라이브러리에서 영감을 얻을 수 있습니다.
그중 하나는 제 (파렴치한 플러그):core-decorators.js

토론 #셋

감사합니다!
우리 같은 얘기 하는 거예요README?나는 readonly의 실현을 찾지 못했다.
어쨌든 나 이제 많이 좋아졌어: 미소:
나는 만약 네가 이 방법에 다른 이름을 지었다면, 예를 들면 fullName, 이 예는 더욱 뚜렷할 것이라고 생각한다.더 간단한 방법은 방법이 아니라 속성을 사용하는 것이다. 그러나 나는 네가 속성에 주석을 추가할 수 없다고 생각한다. 아니면 네가 할 수 있겠니?
대략core-decorators알겠습니다!
 _extractFunctionSignature(fn) {
    return fn
      .toString()
      .replace(
        FUNCTION_REGEXP,
        (match, name = this.key, params) => name + params
      );
  }
잘했어.그래서 기본적으로 너는 함수체를 해석해서 주석을 추출해야 한다.이것은 컴파일할 때 발생하기 때문에 성능에 영향을 주지 않고 기다리고 있을 뿐입니다. 그렇습니까?

토론 #4

@bucaran @wycats가 클래스 속성을 예로 사용하지 않는 이유는 독립된 제안이기 때문입니다.( class properties proposal )
주의해야 할 것은 장식사! ==주석.장식 프로그램은 실제적으로 설명자 자체를 변경할 수 있는데 그 중에서 주석은 메타데이터일 뿐이고 나중에 그것을 검사하고 조작할 수 있다.
바벨.js는 속성에 decorator를 사용할 수 있지만, 이것은 매우 새로운 기능이기 때문에 edgecase bug는 여전히 해결 중입니다.장식기와 클래스 속성이 최종적으로 확정되지 않았으니 이 점을 기억하세요.
핵심 장식사
장식기는 운행 시 함수다.그것들은 컴파일할 때 실행되지 않는다.컴파일할 때 '실행 코드' 가 무엇을 의미하는지 고려하면 불가능합니다.따라서 다른 함수 호출과 마찬가지로 어떤 장식기를 사용해도 성능에 영향을 미칠 수 있다.내 라이브러리의 @override에서 나는 자술에서 다음과 같이 지적했다.

The idea is these decorators would be used to ensure code sanity, but would be removed in production builds via a Babel plugin.


비록 이 플러그인은 아직 쓰이지 않았지만, 나는 이 babel issue 에서 차단되었기 때문에, 나는 며칠 전에 이 라이브러리를 발표했다.
일리가 있습니까?스미리:

토론 #5

알겠습니다.
내가 말한 번역 시간은 전통적인 의미의 번역을 가리키는 것이 아니지만, 나는 확실히 이 단어를 모호하게 사용했다.
현재, 나는 이것이 성능에 뚜렷한 영향을 미친다는 것을 발견했다. 주석을 사용한 코드에서 생성된 코드는 실행할 때 속성을 설정해야 하기 때문이다.

토론 #6

@bucaran. 만약 당신의 질문에 모두 대답을 얻었다면, 당신은 우리를 도와 이 벌금 고지서를 닫을 수 있습니까?미소:
감사합니다!

좋은 웹페이지 즐겨찾기