JS의 기능 마커에 대해 말하면, 나는 항상 그것이 조금 이상하다고 생각합니다. 이 속성에 대해 왜 이야기합니까? 문제에 대한 질문에서 비롯되었습니다. 우리는 모두 창 객체가 실제로 있다는 것을 알고 있습니다
브라우저 창의 인스턴스가 인스턴스 이므로이 인스턴스는 다음과 같은 "속성"및 "메소드"가 있어야합니다.
기능을 사용하면 이름, 나이 등과 같은 일부 속성을 정의하고 작업을 삭제, 설정 및 업데이트 할 수도 있습니다.
그런 다음 다음 질문입니다. 이 원칙에 따라 내 사람 객체의 이름을 동적으로 수정할 수 있으므로 창 아래에서 정의되지 않은 값을 수정할 수 있어야합니다. 그런 다음 살펴 보는 데 매우 관심이 있습니다.
결과는 여전히 생각할 수 있습니다. 정의되지 않은 값을 성공적으로 수정하지 않았으므로 왜 이런 일이 일어나고 있습니까? 이유가 없습니다. 이전 기사에서 언급 한 포장 유형은 아니지만 결과를 존중해야합니다. 이것은 기본 JS가 그러한 결과를 일으키기 위해 무언가를했음을 보여줍니다. 실제로, 기본 JS에서, writable = false 플래그는 기본적으로 정의되지 않은 속성을 작성하지 않게하는 데 사용됩니다. 아래에서 자세히 살펴 보겠습니다.
1 : [쓰기 가능] 기능
속성이 쓸 수 있는지 여부와 관련하여 C#의 GET/SET 액세서 또는 Readonly 키워드를 생각할 수 있습니다. 아래에서는 속성의 읽기 전용 작업을 수행 해야하는 방법에 관심이 있습니다. JS에서는 DefineProperty 메소드를 사용하면됩니다.
위의 예에서 세 가지 재미있는 것들을 볼 수 있습니다.
<1> : DefineProperty 메소드를 사용하여 Person.Name을 읽기 전용 필드로 전환했습니다. 누군가는 이것이 분명히 방법이라고 말하고 싶어하지만 어떻게 기능이 될 수 있습니까? 내 마음 속에는 기능이 있습니다
[xxx] 모드이므로 JS의 차이입니다. 결국, JS에는 구문 설탕이 없으므로 정의 특성은 기본 공개 방법, 즉 DefineProperty를 통해서만 정의 할 수 있습니다.
<2> :이 방법에서는 쓸 수있는 것뿐만 아니라 구성 가능도 볼 수 있습니다. 그래서 이것은 무엇입니까? 실제로 이것은 JS 엔진에 속성을 삭제하고 업데이트 할 수 있는지 여부를 알려주는 기본 구성입니다. 구성 가능성을 False로 설정하면 P.Name을 삭제할 수 없습니다. 이는 잘못된 작업이기 때문입니다.
이것을 읽은 후에는 왜 undifined가 삭제하거나 업데이트 할 수 없는지 이해해야한다고 생각합니다. 그들은 모두 이상한 점수로 만들어졌습니다. 매우 흥미 롭다고 생각하십니까?
<3> : 다음으로 생각할 가치가있는 질문은 JS 엔진이 어떻게하는지입니다. C#에는 속성이 있으며이 속성은 컴파일러에 의해 컴파일 된 후 메타 데이터에 기록됩니다. 그런 다음 반사를 사용하여 속성에서 값을 얻을 수 있습니다. 예를 들어, 직렬화 가능한 직렬화 클래스는 직렬화 가능한 형식에 클래스를 반영하고 읽는 방법, 직렬화 될 수 있고 할 수없는 클래스를 반영하고 읽는 방법을 알려주는데 비 정기 태그를 사용해야합니다.
코드 사본은 다음과 같습니다.
[시리얼이즈 가능]
공개 수업 테스트
{
[비 서리 화]
공개 문자열 이름;
}
그림에서, 우리는 IL에서 이름이 해설되지 않았 음을 알 수 있습니다. 우리는 JS에 반영이 없다는 것을 알고 있으므로 획기적인 것은 자연스럽게 DefineProperty 방법에 있습니다. 불행히도, 우리는이 메소드의 기본 소스 코드가 어떤지 알 수 없으므로, 이름 필드에 동적으로 필요한지 알지 못합니다. 우리는 이해에 기초하여 JS 엔진에서 발생할 수있는 동작 만 추측 할 수 있습니다.