이 기사를 읽으려면 다른 언어로 프로그래밍 경험이 필요합니다.
JavaScript의 간단한 유형은 다음과 같습니다.
1. 숫자
2. 문자열
3. 부울 (참과 거짓)
4. 널
5. 정의되었습니다
다른 유형은 객체입니다 (우리는 연산자 유형의 반환 값에 의해 혼동되어서는 안됩니다).
1. 함수
2. 아레
3. 정규 표현
4. 객체 (객체는 자연스럽게 객체입니다)
객체 기준
JavaScript에서 객체는 속성 모음 (객체는 연관 배열입니다)이며 각 속성은 다음과 같습니다.
1. 속성 이름은 문자열이어야합니다
2. 속성 값은 정의되지 않은 것 외에 다른 값일 수 있습니다.
객체 문자를 통해 객체를 만듭니다.
코드 사본은 다음과 같습니다.
// 객체 문자 그대로 {}를 통해 빈 객체를 만듭니다.
val empty_object = {};
객체의 속성 이름 및 속성 값 :
코드 사본은 다음과 같습니다.
var stande = {
// "First-Name"은 속성 이름이고 "Jerome"은 속성 값입니다.
"First-Name": "Jerome",
// "last-name"은 속성 이름이고 "하워드"는 속성 값입니다.
"마지막 이름": "하워드"
};
속성 이름이 법적 식별자 인 경우 견적 표시를 생략 할 수 있습니다.
코드 사본은 다음과 같습니다.
var flight = {
항공사 : "해양",
번호 : 815,
부서: {
IATA : "Syd",
시간 : "2004-09-22 14:55",
시티 : "시드니"
},
도착 : {
IATA : "LAX",
시간 : "2004-09-23 10:42",
시티 : "로스 앤젤레스"
}
};
속성 액세스의 예를 살펴 보겠습니다.
코드 사본은 다음과 같습니다.
var 소유자 = {이름 : "name5566"};
소유자. 이름; // "이름 5566"
소유자 [ "이름"]; // "이름 5566"
소유자 .JOB; // 한정되지 않은
소유자 .job = "코더"; // 또는 소유자 [ "job"] = "Coder";
속성 이름이 법적 식별자가 아닌 경우 인용문으로 감겨 있어야합니다. 존재하지 않는 속성의 가치는 정의되지 않습니다. 객체는 값보다는 참조별로 전달됩니다.
코드 사본은 다음과 같습니다.
var x = {};
var 소유자 = x;
소유자 .name = "name5566";
X. 이름; // x.name === "Name5566"
여기 x와 소유자는 동일한 객체를 참조하십시오.
삭제 연산자를 사용하여 객체의 속성을 삭제할 수 있습니다.
코드 사본은 다음과 같습니다.
obj.x 삭제; // 객체 obj의 x 속성을 삭제합니다
물체의 프로토 타입
각 객체는 프로토 타입 객체에 연결되어 있으며 객체는 프로토 타입 객체에서 속성을 상속받을 수 있습니다. 프로토 타입 객체 인 Object.Prototyp 객체 (Object.Prototyp 객체 자체에는 프로토 타입 객체가 없음)를 통해 개체를 통해 객체를 만듭니다. 객체를 만들 때 객체의 프로토 타입 객체를 설정 한 다음 특정 설정 방법을 논의 할 수 있습니다). 객체의 속성을 얻으려고 할 때, 객체가 존재하지 않는 경우, JavaScript는이 객체의 프로토 타입 객체에서 속성을 가져 오려고 시도하고, 프로토 타입 객체에 그러한 속성이 없다면,이 프로토 타입 객체의 프로토 타입 객체를 찾아서 개체. 속성을 얻는 것과 비교하여 객체의 속성을 수정하면 프로토 타입 객체에 영향을 미치지 않습니다.
기능적 기본
함수는 또한 JavaScript의 객체이며 기능에 연결되어 있습니다. 프로로 타입 프로토 타입 객체 (function.prototype 링크에 대한 링크). 이 기능에는 프로토 타입이라는 속성이 있으며 그 값은 객체입니다. 이 객체는 속성 생성자가 있으며 생성자의 값 이이 기능입니다.
코드 사본은 다음과 같습니다.
var f = function () {}
F. 프로토 타입의 타입; // '물체'
f.prototype.constructor의 타입; // '기능'
f === f.prototype.constructor; // 진실
함수는 객체이며 객체 사용과 같은 함수를 사용할 수 있습니다. 참고로,이 기능에는 두 가지 숨겨진 속성이 있습니다.
1. 함수의 맥락
2. 기능 코드
함수는 다음과 같이 생성됩니다.
코드 사본은 다음과 같습니다.
var f = 함수 추가 (a, b) {
A + B를 반환합니다.
}
Console.log (F); // 출력 [기능 : 추가]
키워드 기능의 기능 이름은 선택 사항입니다. 우리는 주로 여러 목적으로 기능 이름을 공식화합니다.
1. 재귀 전화를 위해
2. 디버거, 개발 도구 등은 기능을 식별하는 데 사용됩니다.
여러 번 우리는 기능 이름이 필요하지 않으며 함수 이름이없는 함수를 익명 함수라고합니다. 매개 변수 목록이 괄호로 감겨 있습니다. JavaScript는 실제 매개 변수 및 공식 매개 변수와 일치하지 않아도됩니다.
코드 사본은 다음과 같습니다.
var add = 함수 (a, b) {
A + B를 반환합니다.
}
추가 (1, 2, 3); // 실제 매개 변수와 공식 매개 변수가 일치하지 않습니다.
실제 매개 변수가 너무 많으면 초과 실제 매개 변수가 무시됩니다. 실제 매개 변수가 너무 적 으면 할당되지 않은 공식 매개 변수의 값이 정의되지 않습니다. 함수의 리턴 값이 있어야합니다. 반환 문을 통해 리턴 값이 지정되지 않은 경우 함수 리턴 값이 정의되지 않습니다.
액세스하는 함수와 외부 변수는 폐쇄를 형성합니다. 이것은 JavaScript의 핵심 매력입니다.
기능 호출
각 함수가 호출되면 두 개의 추가 매개 변수가 수신됩니다.
1. 이것은
2. 경사
이것의 값은 특정 통화 패턴과 관련이 있습니다. JavaScript에는 네 가지 호출 패턴이 있습니다.
1. 방법 호출 모드. 객체의 속성이 함수 인 경우 메소드라고합니다. 메소드가 OM (args)을 통해 호출되는 경우, 이것은 객체 O입니다 (이는 이것과 o가 호출 될 때만 바인딩된다는 것을 알 수 있습니다).
코드 사본은 다음과 같습니다.
var obj = {
값 : 0,
증분 : 함수 (v) {
this.value += (typeof v === '숫자'? V : 1);
}
};
obj.increment (); // 이것은 === obj입니다
2. 기능 호출 모드. 함수가 객체의 속성이 아닌 경우 함수로 호출되며 이는 예를 들어 글로벌 객체에 바인딩됩니다.
코드 사본은 다음과 같습니다.
메시지 = 'Hello World';
var p = function () {
Console.log (this.message);
}
피(); // 출력 'Hello World'
이 동작은 때때로 혼란 스럽습니다. 예를 참조하십시오.
코드 사본은 다음과 같습니다.
obj = {
값 : 0,
증분 : function () {
var helper = function () {
// 글로벌 객체의 값에 1을 추가합니다.
this.value += 1;
}
// 헬퍼를 함수라고합니다
// 이것은 글로벌 객체입니다
돕는 사람();
}
};
obj.increment (); // obj.value === 0
우리가 기대하는 결과는 다음과 같습니다.
코드 사본은 다음과 같습니다.
obj = {
값 : 0,
증분 : function () {
var that = this;
var helper = function () {
value += 1;
}
돕는 사람();
}
};
obj.increment (); // obj.value === 1
3. 생성자 호출 모드. 새로운 접두사를 사용하려는 함수는 예를 들어 생성자라고합니다.
코드 사본은 다음과 같습니다.
// 테스트를 생성자라고합니다
var test = function (String) {
this.message = string;
}
var mytest = new Test ( "Hello World");
함수는 새로 호출 할 수 있습니다 (이러한 기능은 일반적으로 대문자로 시작합니다). 새 기능을 추가 한 후이 함수의 프로토 타입 속성에 연결된 객체가 생성되며 생성자 의이 객체는이 객체입니다.
4. 통화 모드를 적용하십시오. 함수의 적용 메소드는 함수를 호출하는 데 사용되는데, 여기에는 두 개의 매개 변수가 있으며, 첫 번째는 이것이고 두 번째는 매개 변수 배열입니다.
코드 사본은 다음과 같습니다.
var add = 함수 (a, b) {
A + B를 반환합니다.
}
var ret = add.Apply (null, [3, 4]); // ret === 7
함수를 호출 할 때 모든 인수가 포함 된 인수 (비 Real JavaScript 배열)라는 클래스에 액세스 할 수 있으므로 가변 길이 매개 변수를 구현할 수 있습니다.
코드 사본은 다음과 같습니다.
var add = function () {
var sum = 0;
for (var i = 0; i <arguments.length; ++ i) {
sum += 인수 [i];
}
반환 합계;
}
추가 (1, 2, 3, 4);
이상
이제 JavaScript의 예외 처리 메커니즘에 대해 이야기 해 봅시다. 우리는 Throw 문을 사용하여 예외를 제외하고 시도 캐시 문을 사용하여 예외를 포착하고 처리합니다.
코드 사본은 다음과 같습니다.
var add = 함수 (a, b) {
if (typeof a! == '번호'|| typeof b! == '숫자') {
// 예외를 던집니다
던지다 {
이름 : 'typeerror',
메시지 : '필요 숫자 추가'
};
}
A + B를 반환합니다.
}
// 예외를 잡고 처리합니다
노력하다 {
추가 ( "7");
// e는 던져진 예외 객체입니다
} catch (e) {
console.log (e.name + ':' + e.message);
}
JavaScript 유형에 속성을 추가하십시오
생성자는 JavaScript의 대부분의 유형에 존재합니다.
1. 객체의 생성자는 객체입니다
2. 배열의 생성자는 배열입니다
3. 함수의 생성자는 함수입니다
4. 문자열의 생성자는 문자열입니다
5. 숫자의 생성자는 숫자입니다
6. 부울의 생성자는 부울입니다
7. 정규 표현의 생성자는 regexp입니다
이 속성이 관련 변수에 사용할 수 있도록 생성자의 프로토 타입에 속성 (종종 메소드 추가)을 추가 할 수 있습니다.
코드 사본은 다음과 같습니다.
번호 .prototype.integer = function () {
반환 수학 [this <0? '천장': '바닥'] (this);
}
(1.1) .integer (); // 1
범위
JavaScript는 기능을 통해 스코프를 구축해야합니다.
코드 사본은 다음과 같습니다.
기능() {
// ...
} ();
익명 기능이 여기에서 생성되고 실행됩니다. 노출을 원하지 않는 변수를 숨기는 범위 :
코드 사본은 다음과 같습니다.
var obj = function () {
// 값을 숨기고 외부에 액세스 할 수 없습니다
var 값 = 0;
반품 {
//이 메소드만이 값을 수정할 수 있습니다
증분 : function () {
값 += 1;
},
//이 메소드 만 값을 읽을 수 있습니다
getValue : function () {
반환 값;
}
};
} ();
obj.increment ();
obj.getValue () === 1;
상속
JavaScript에서 상속을 구현하는 방법에는 여러 가지가 있습니다.
객체를 만들 때 객체와 관련된 프로토 타입 객체를 설정할 수 있으며 다음을 수행 할 수 있습니다.
코드 사본은 다음과 같습니다.
// 프로토 타입 객체 {x : 1, y : 2}로 오브젝트 O를 만듭니다.
var o = object.create ({x : 1, y : 2});
객체는 ECMAScript 5에 정의되어 있습니다. ECMAScript 3을 사용하는 경우 작성 방법을 직접 구현할 수 있습니다.
코드 사본은 다음과 같습니다.
// 객체가 제작 된 메소드가 정의되지 않은 경우
if (object.create! == 'function') {
// 객체를 만듭니다
object.create = function (o) {
var f = function () {};
F. 프로토 타입 = O;
// 새 객체 생성,이 개체의 프로토 타입 개체는 O입니다.
새로운 f ()를 반환합니다.
};
}
개체를 통해, 우리는 프로토 타입 기반 상속을 수행합니다. 새로운 객체는 오래된 객체의 속성을 직접 상속합니다 (클래스 기반 상속에 비해 클래스의 존재가 필요하지 않으며, 객체는 객체를 직접 상속합니다). 예:
코드 사본은 다음과 같습니다.
var mymammal = {
이름 : '포유류 허브',
get_name : function () {
이 this.name;
},
말 : function () {
이 this.saying || '';;
}
};
// myMammal을 상속합니다
var mycat = object.create (MyMammal);
mycat.name = 'Henrietta';
mycat.saying = 'meow';
mycat.purr = function (n) {
var i, s = '';
for (i = 0; i <n; i += 1) {
if (s) {
s += '-';
}
s += 'r';
}
반환 s;
};
mycat.get_name = function () {
reture this.says () + '' + this.name + '' + this.says ();
};
위의 코드는 간단하지만 개인 회원을 보호 할 수는 없습니다. 모듈 모드를 사용할 수 있습니다. 모듈 모드에서 특정 유형의 객체는 함수에 의해 생성되며 함수 범위를 사용하여 개인 멤버를 외부 액세스로부터 보호합니다.
코드 사본은 다음과 같습니다.
// 포유류 물체를 구성하는 데 사용되는 포유 동물 기능
var mammal = function (spec) {
// 그것은 구성된 객체입니다
var that = {};
// 공개 메소드 get_name에 외부에 액세스 할 수 있습니다
that.get_name = function () {
// SPEC.Name은 외부에서 직접 액세스 할 수 없습니다
반환 사양의 이름;
};
// 공개 방법에 따르면 외부에서 액세스 할 수 있습니다
that.says = function () {
// SPEC. 외부에 직접 액세스 할 수 없습니다
반환 사양 .saying || '';;
};
그것을 돌려주십시오.
};
// 포유류 객체를 만듭니다
var mymammal = 포유류 ({이름 : 'Herb'});
// 고양이 기능, 고양이 물체를 구성하는 데 사용됩니다
var cat = function (spec) {
SPEC.SAYING = SPEC.SAYING || '야옹';
// 고양이는 포유류에서 상속되어 먼저 포유류 물체를 구성합니다.
var that = 포유 동물 (사양);
// 공개 방법을 추가하십시오
that.purr = function (n) {
var i, s = '';
for (i = 0; i <n; i += 1) {
if (s) {
s += '-';
}
s += 'r';
}
반환 s;
};
// 공개 메소드 수정 get_name
that.get_name = function () {
reture that.says () + '' + spec.name +를 반환합니다
'' + that.says ();
그것을 돌려주십시오.
};
};
// 고양이 객체를 만듭니다
var mycat = cat ({이름 : 'Henrietta'});
모듈 모드에서는 생성자를 호출하여 상속이 달성됩니다. 또한 서브 클래스에서 부모 클래스의 메소드에 액세스 할 수도 있습니다.
코드 사본은 다음과 같습니다.
Object.Prototype.superior = function (name) {
var that = this, method = that [name];
return function () {
반환 방법.
};
};
var coolcat = function (spec) {
// 서브 클래스의 get_name 메소드를 가져옵니다
var that = cat (spec), super_get_name = that.superior ( 'get_name');
that.get_name = function (n) {
return 'like' + super_get_name () + 'baby';
};
그것을 돌려주십시오.
};