ECMASCRIPT5 소개 5
우선, 우리는 ecmascript가 신입니다. 우리는 JavaScript 또는 Livescript가 원래 Netscape에 의해 만들어졌으며 나중에 Microsoft도 JScript를 만들었습니다. Scriptease에는 자체 Cenvi도 있습니다. 이런 식으로, 자신의 브라우저 스크립트의 세 가지 버전이 있습니다. 모든 사람은이 혼란을 이해하므로 표준화 문제는 의제에 적용됩니다. 1997 년에 JavaScript1.1을 기반으로 한 제안은 유럽 컴퓨터 제조업체 협회 (유럽 컴퓨터 M 제조업체)에 제출되었습니다. 마지막으로, 모두는 ECMAScript라는 새로운 스크립팅 언어 표준 인 ECMA-262를 개발했습니다. 이듬해 ISO/IEC (국제 표준화 및 국제 전기 기술위원회)도 ECMAScript를 표준으로 채택했습니다. 그 후, 세상은 평화 롭습니다. 주요 브라우저 제조업체는 ECMAScript를 각각의 JavaScript 구현의 기초로 사용합니다. 물론, 그것은 단지 기초 일 뿐이며 완전히 따르지 않았습니다. 그렇지 않으면 브라우저 호환성 문제가 많지 않습니다.
ECMAScript5 란 무엇입니까? 이름에서 알 수 있듯이, 그것은 iPhone 5와 마찬가지로이 이상한 것의 다섯 번째 버전입니다. 우리가 자주 사용하는 ECMAScript3는 장난감이 아닌 실제 프로그래밍 언어로 간주되며 매우 인기가 있습니다.
텍스트:
나는 항상 이전에 Get/set에 대한 잘못된 이해를 가지고 있었고 Get Set은 객체 속성 방법이라고 생각합니다. 또한 다른 사람들의 블로그를 읽은 후 많은 질문이있었습니다. 오늘날이 시스템은 많은 테스트를 수행하여 마침내 파악했습니다. (읽기 및 쓰기 데모 테스트를 직접 통과하면 잘못된 것이 있다면 나를 비판하고 수정하는 것을 환영합니다).
get/set 액세서는 물체의 속성이 아니라 재산의 속성입니다. 모든 사람은 명확하게 구별해야합니다. 기능은 내부적으로 만 사용되므로 JavaScript에서 직접 액세스 할 수 없습니다. 특성이 내부 값임을 나타 내기 위해 [value]와 같은 두 팀 사이의 괄호로 둘러싸여 있습니다.
1. 이러한 속성의 특성을 간단히 소개하겠습니다 (여기 간단한 승인이 있습니다).
(1) 데이터 속성 - 데이터 값을 포함하는 위치. 이 위치는 값을 읽고 쓸 수 있습니다.
데이터 속성에는 동작을 설명하는 네 가지 특성이 있습니다.
[[configurable]] : 구성 가능합니까?
[[열거 가능]] : 열거 가능합니까?
[[쓰기 가능]] : 읽을 수 있습니까?
[[value]] : 속성 값
(2) 액세서 속성 속성 - 데이터 값이 포함되어 있지 않으며 getter 및 setter 함수가 포함되어 있습니다 (이 두 함수는 필요하지 않음)
액세서 속성은 또한 그들의 행동을 설명하는 네 가지 특성을 가지고 있습니다.
[[configurable]] : 구성 가능합니까?
[[열거 가능]] : 열거 가능합니까?
[[get]] : 속성을 읽을 때 호출 된 함수는 기본값이 정의되지 않았습니다.
[[set]] : 속성을 작성할 때 호출 된 함수는 기본값이 정의되지 않았습니다.
2. 여기서 우리는 [[get]]/[[set]]를 소개하는 데 중점을 둡니다.
먼저 책에 언급 된 Get/Set Accessor의 행동 특성에 대해 이야기합시다. Get/Set Accessor는 정의없이 읽고 쓸 수 있습니다. 당신은 또한 하나만 정의 할 수 있습니다. get 만 정의되면 설명 된 속성은 읽을 수 있고 쓰기는 안됩니다. 세트 만 정의되면 설명 된 속성은 작성되어 읽을 수 없습니다.
(1) 우리의 원래 get 세트 방법은 다음과 같습니다.
함수 foo (val) {var value = val; this.getValue = function () {return value;}; this.setValue = function (val) {value = val;};} var obj = new foo ( "hello"); Alert (obj.getValue (// "hi"hi ");위의 코드는 클로저 범위를 사용하여 구현 된 Get 세트 방법입니다. 메소드는 속성 속성이 아닌 인스턴스 객체의 속성 메소드입니다. 정의되지 않으면 값 값에 액세스 할 수 없습니다.
함수 foo (val) {var value = val;/* this.getValue = function () {return value;}; this.setValue = function (val) {value = val;};*/} var obj = new foo ( "hello"); alert (obj.value); // 정의되지 않은다음 예제는 또한 속성 속성이 아닌 객체의 속성 메소드입니다.
var obj = {name : "john", get : function () {return this.age;} // get 만 정의되고, 세트가 정의되지 않았지만, 여전히 읽기, 쓰기 및 이름 속성이있을 수 있습니다. 단지 일반 객체 속성}; alert (obj.name); // John readable obj.name = "jack"; // writable alert (obj.name); // jack(2) 액세서 속성의 속성으로 액세서를 가져 오기/설정하십시오.
다시 말하지만, 그것은 객체의 속성이 아니며, 속성을 읽고 쓸 수 있는지 여부를 결정합니다. 설정하지 않으면 정상적으로 읽고 쓰는 것과 마찬가지로 괜찮습니다 (속성을 읽거나 읽을 수 있습니다.
속성 자체에 대한 액세스를 작성, 읽기 및 쓰기)
get /set 속성을 변경하는 두 가지 방법이 있습니다.
에이. Object.DefineProperty () 사용
var object = {_ name : "daisy"}; object.defineProperty (object, "name", {// 여기 메소드 이름은 이름 속성이 정의되었음을 의미합니다 (따라서 Object.Name을 통해 액세스 할 수 있음)을 의미합니다. getter 액세서 만 정의되며, [value] value get : // get 속성 만 읽을 수는 없습니다. this._name;}}); Alert (Object.Name); // "Daisy"Object.name = "Jack"; // getter 액세서 만 정의되어 있으므로 쓰기는 유효하지 않은 경고 (Object.Name); // "daisy"객체. "Jack"; // getter accessor 만 정의되어 있습니다.Object.DefineProperty (Object, Pro, {})의 속성 이름은 Object.Pro가 액세스 한 속성에 해당해야합니다.
비. get set 키워드 사용 :
var object = {_ name : "daisy", get name () {// 여기의 메소드 이름은 이름 속성이 정의되었음을 의미합니다 (따라서 Object.Name을 통해 액세스 할 수 있음). Getter Accessor 만 정의됩니다. [value]] 값은 정의되지 않습니다. return this._name;} // get, set 메소드는 객체 메소드가 아닌 속성의 속성 일 뿐이며, 이는 속성을 읽고 쓸 수 있는지 여부를 결정합니다}; Alert (Object.Name); // Daisy 여기서 밑줄을 제거하는 방법은 데이지입니다. 게다가 undefinedObject.name = "jack"; // getter 액세서 만 정의되므로 읽을 수는 있지만 Alert (Object.Name); // Daisy는 읽을 수 있습니다.위의 두 가지 방법은 동일합니다. 위의 두 가지 메소드는 객체 객체에 두 가지 속성을 갖습니다. _name (초기 값) 이름 (초기 값 없음)은 브라우저 콘솔을 통해 볼 수 있습니다.
그렇다면이 이름 속성은 언제 실제로 정의됩니까? Object.DefineProperty (Object, Pro, {})는 객체의 새 속성 Pro를 정의 할 수 있습니다. get pro () {}/set pro () {} 및 object.defineProperty (object, pro, {})도 동일하기 때문에 새로운 속성 프로도 정의됩니다. 이것이 객체에 두 가지 속성이있는 이유입니다.
(3)이 기사의 JavaScript에서 Get and Set Accessor의 구현 코드 : 표준 표준의 Get and Set 액세서 구현과 관련 : 합리적인 생각
나는 나 자신의 예를 썼다
function foo (val) {this.value = val; // 값 속성이 정의되고 _value} foo.prototype = {set value (val) {// 메소드 이름과 속성 이름이 동일하고, 값 속성은 프로 타입에 정의되어 있습니다. 프로토 타입에 정의 된 return this._value;}}; // 액세서가 반환하여 설정합니다. 둘 다 _name이며 여기에는 정의가 없습니다. 왜 읽거나 쓸 수 있습니까? ? ? ? var obj = new foo ( "hello"); Alert (obj.value); // "hello"obj.value = "yehoo"; 경고 (obj.value); // "yehoo"위의 질문을 해결하기 위해 많은 테스트가 이루어졌습니다. 하나씩 살펴 보겠습니다.
먼저이 예를 살펴보십시오. Get 기능 만 프로토 타입에 정의됩니다. OBJ.Value에서 값 속성을 읽을 때 인스턴스에서이를 찾은 다음 프로토 타입에서 찾으십시오. get 메소드는 호출되며 읽을 수는 있지만 기록 할 수 없습니다.
function foo (val) {this._value = val; // 여기 속성은 밑줄이 그어져 있고, 인스턴스 객체의 _value 속성을 초기화하고, _value 속성을 읽을 수 있고 쓸 수 있습니다} foo.prototype = {// set 값 (val) {// 메소드 이름은 속성 이름과 동일하다. }, get value () {// 메소드 이름은 속성 이름과 동일하고 프로토 타입의 값 속성을 정의하고 그 get 속성을 반환합니다 ._value;}}; var obj = new foo ( "hello"); alert (obj.value); // hello는 프로토 타입의 값에 액세스합니다. 쓰기는 잘못된 경고 (obj.value); // hello입니다이 ._value가 생성자의 밑줄에서 제거되면 프로토 타입에 정의 된 값 속성은 get 속성을 정의합니다. 여전히 값 속성의 읽기 및 쓰기를 제어 할 수 있습니다. 다시 말해, obj.value가 속성에 액세스 할 때 Get 메소드가 호출되어 먼저 객체 자체에서 검색 한 다음 프로토 타입을 검색합니다. 아무것도 없다면, 정의되지 않은 것으로 간주됩니다. 기본값은 읽을 수 있고 쓰기가 가능합니다.
function foo (val) {this.value = val; // 값의 기능 만 프로토 타입에 정의되므로 여기에 쓰기가 잘못되었습니다} foo.poo.poo.pootype = {// 메소드 이름과 속성 이름이 동일하다는 점에 유의하십시오. 값 값이 수동으로 작성되면 Get 메소드 가이 this._value가 올바르게 읽을 수 없으므로 값을 올바르게 읽을 수 없습니다. "hah"// get pro () {} 및 set pro () {} 속성이 선언되는 한, 읽기 및 쓸 수 있지만 함수 정의가 잘못되면 정확한 속성 값에 필요한대로 액세스 할 수 없습니다. 값 () {// 메소드 이름은 속성 이름과 동일합니다. 값 속성과 그 get 속성은 프로토 타입에 정의되어 있습니다. 이 this._value;}}; var obj = new foo ( "hello"); // "hello"는 성공적으로 기록되지 않았다 (obj.value); // undefined obj.value = "yehoo"; // get 속성 만 정의되므로 읽을 수는 있지만 쓰기가 잘못된 경고 (obj.value); // value alert (// value);위의 예를 읽을 수 있고 쓰기가 불가능하다는 것을 증명하기 위해 : 수동으로 _value : "hah"는 값을 읽을 수 있지만 쓸 수는 없습니다.
function foo (val) {this.value = val; // 값의 기능 만 프로토 타입에 정의되므로 여기에 쓰기가 잘못되었다} foo.poo.poo.poo.pootype = {// 메소드 이름과 속성 이름이 동일하다는 점에 주목하십시오. 값 값이 수동으로 작성되면 Get 메소드 가이 this._value가 올바르게 읽을 수 없으므로 값을 올바르게 읽을 수 없습니다. "hah"// get pro () {} 및 set pro () {} 속성이 선언되는 한, 읽기 및 쓸 수 있지만 함수 정의가 잘못되면 정확한 속성 값에 필요한대로 액세스 할 수 없습니다. 값 () {// 메소드 이름은 속성 이름과 동일합니다. 값 속성과 그 get 속성은 프로토 타입에 정의되어 있습니다. 이 this._value;}}; var obj = new foo ( "hello"); // "hello"는 성공적으로 기록되지 않았다 (obj.value); // "hah"obj.value = "yehoo"; // get 속성 만 정의되므로 읽을 수는 있지만 쓰기가 잘못된 알림 (obj.value); "Hah"값 : "hah"가 수동으로 작성된 경우 값의 값을 읽으려고 노력할 수 있습니까? get 메소드에 의해 반환 된 value는 정의되지 않기 때문에 obj.value는 값 값을 읽고 get value () {} 메소드가 실패하지만 값은 여전히 쓸 수 없습니다.
function foo (val) {this.value = val; // 값의 특징 만 프로토 타입에 정의되므로 여기에 쓰기가 잘못되었다} foo.poo.poo.poo.pootype = {// 메소드 이름과 속성 이름이 동일하다는 점에 유의하십시오. 값 값은 수동으로 작성됩니다. get 메소드 가이 this._value, 값을 올바르게 읽을 수 없기 때문에 : "hah"// get pro () {} 및 set pro () {} 속성이 선언되는 한, 읽고 쓸 수 있지만 함수 정의가 잘못되면 필요한대로 액세스 할 수 없습니다. 값 () {// 메소드 이름과 속성 이름은 동일합니다. 값 속성과 GET 기능은 프로토 타입에 정의됩니다. 이 this._value;}}; var obj = new foo ( "hello"); // "hello"는 성공적으로 경고하지 않았다 (obj.value); // obj.value 가이 value를 반환하기 때문에 무효가 무효를 읽지 않았으며, 값이없고, 정의되지 않은 value = "yehoo"; get feature는 독창적이지 않지만, get feature가 읽을 수 없지만, Alert (obj.value); // 정의되지 않았습니다이 예를 살펴보면 get set이 정의되지만 정의되지 않은 value를 반환합니다. 값을 읽고 쓸 수 있음을 알 수 있습니다. 프로토 타입에서 Get Set 메소드를 제거하면 여전히 읽을 수 있거나 쓸 수 있습니다.
함수 foo (val) {this.value = val;} foo.poo.pootype = {set value (val) {this._value = val;}, get value () {return this._value;}}; var obj = new foo ( "hello"); Alert (obj.value); // hello obj.value = "yehoo"; Alert (obj.value); // yehoo function foo (val) {this.value = val;} // get/set 특성이 rak exactor가 정의되지 않은 곳으로 돌아갑니다. foo ( "hello"); alert (obj.value); // hello obj.value = "yehoo"; Alert (obj.value); // yehoo요약
get pro () {} 속성 만 읽을 수 있으며 쓰기가 불가능합니다.
set pro () {} 속성을 쓰기 가능하고 읽을 수 없다고 선언하십시오.
신고서 중 어느 것도 선언되지 않으면 속성을 읽을 수 있고 쓰기 쉽습니다.
모든 선언이 이루어지면 Get Set에 의해 정의 된 방법에 따라 읽고 쓰십시오.
모두 선언되지만 정의 된 읽기 및 쓰기 방법을 올바르게 읽고 쓸 수 없으면 GET/SET은 실패합니다. 기본 읽기 가능하고 쓰기 쉬운 것이 되십시오
프로토 타입에 정의 된 값 속성은 get 속성을 정의합니다. 여전히 값 속성의 읽기 및 쓰기를 제어 할 수 있습니다. 다시 말해, obj.value가 속성에 액세스 할 때 Get 메소드가 호출되고, 먼저 객체 자체를 검색 한 다음 프로토 타입에서 검색합니다. 아무것도 없다면 정의되지 않은 것으로 간주됩니다. 기본값은 읽을 수 있고 쓰기가 가능합니다.
다시 채우다:
get pro () {}/set pro () {} 또는 object.defineProperty (object, pro, {get : function () {return this._name;}});Pro는이 반환과 동일 할 수 없습니다. 그렇지 않으면 다음 오류 가보고됩니다.
마스터의 수정 후, 오류가 여기에보고되는 이유를 이해합니다.