JavaScript는 C Language 이후에 접촉 한 두 번째 프로그래밍 언어입니다. 신입생 여름 휴가 기간 동안, 나는 도서관에서 중국어로 작성된 JavaScript 프로그래밍을 발견했습니다. 당시 나는 거의 프로그래밍에서 초보자였습니다. 또한이 책은 JavaScript의 프로그래밍 메커니즘을 전혀 언급하지 않았으며 오해의 소지가있는 단어가있었습니다. 나는 JavaScript가 브라우저에서 실행되는 객체 지향 언어 일 뿐이라고 믿으며 항상 JavaScript에 대해 깊은 오해를 받았습니다. JavaScript에서 혼란스럽고 오해하는이 기사를 적어 봅시다. 물론, 저자의 제한된 수준과 개발 경험이 없기 때문에 필연적으로 누락이 발생하며 비판과 교정이 이루어지기를 바랍니다.
JavaScript 객체
대상은 무엇입니까?
새로운 키워드는 JavaScript 코드의 모든 곳에서 볼 수 있으며, JavaScript는 Java와 마찬가지로 클래스 상속에 기반한 언어라는 것을 쉽게 이해하기 쉽습니다. 그러나 이것은 사실이 아닙니다. JavaScript에는 클래스가 없습니다. 그렇다면 클래스가 아닌 JavaScript의 대상은 무엇입니까? 어떤 의미에서 JavaScript 객체는 파이썬의 사전 (해시 테이블)이며 실제로는 다음과 비슷한 키 값 쌍입니다.
me = { "fisrtname": "seek", "lastname": "truth", "getname": function () {return this.firstname+this.lastname; // 이것은이 개체에 대한 포인터와 동일합니다}}이것은 다소 오해입니다. 내가 처음 보았을 때, 나는 약간 이해할 수없는 느낌이 들었지만 여전히 그것을 신중하게 사용하는 것이 합리적이라고 느꼈습니다. [] 연산자를 사용하여 Python과 같은 요소를 얻거나 사용할 수 있습니다. 요소를 얻는 연산자 :
me.firstname // => seekme [ "lastname"] // => ruppleme.getname () // => seekTruth
새로운 운영자
JavaScript에는 클래스가 없기 때문에 새로운 운영자는 무엇을하고 있습니까? 이것은 JavaScript 디자인에서 가장 오도하는 측면 중 하나입니다. JavaScript는 기능적 프로그래밍 언어입니다. JavaScript의 기능은 일류 시민이며 JavaScript의 기능도 대상입니다. 기능 객체는 생성 될 때 호출 속성을 호출하도록 추가됩니다. 더 많은 함정은 JavaScript 함수를 호출하는 두 가지 방법이 있다는 것입니다. 하나는 새로운 키워드로 전화하고 다른 하나는 새로운 키워드없이 전화하는 것입니다. 전자는 객체를 반환하고 후자는 반환 문의 내용을 반환합니다. 다음 기능을 고려하십시오.
함수 obj (이름) {this.name = 이름; 반환 이름;}새 연산자를 사용하여 전화를 걸면 다음과 같습니다.
obj = new obj ( "SeekTruth") // obj는 대상이 될 것입니다 : { "name": "seektruth"}
직접 전화하면 :
obj = obj ( "SeekTruth") // obj는 문자열이 될 것입니다 : "SeekTruth"
실제로 매우 까다로운 디자인입니다. 우리가 전화 할 때, 우리는 새로운 사용이 필요한지를 구별해야합니다. 일반적으로, 새로운 키워드를 사용해야하는 기능은 대문자로 시작됩니다.
또 다른 까다로운 것은 반환 된 반환 값이 객체라는 것입니다.
함수 obj (이름) {this.name = 이름; 반품 {};}이런 식으로, 새 연산자에게 전화 여부에 관계없이, 우리는 return 문의 값을 반환합니다.
new obj ( "seekTruth") // => {} obj ( "SeekTruth") // => {}도대체 디자인은 ...
객체 상속
원기
앞에서 언급했듯이 JavaScript에는 클래스가 없으므로 JavaScript는 어떻게 상속을 구현합니까? 대답은 프로토 타입 체인을 통한 것입니다. JavaScript에서는 각 객체에는 프로토 타입이 있습니다. 객체를 만들 때, 지정되지 않은 경우 객체에 의해 상속 된 프로토 타입은 Object.Prototype입니다. 함수 객체는 function.prototype (function.prototype 상속 대상. 프로로 타입)를 상속합니다.
object.prototype // => {} function.prototype // => [function]우리는 객체의 __proto__ 친숙성을 통해 객체의 프로토 타입을 볼 수 있습니다.
a = {} a .__ proto__ // => {}JavaScript는 객체의 프로토 타입을 지정하여 상속을 구현합니다. 객체의 프로토 타입을 지정하는 세 가지 주요 방법이 있습니다. 하나는 생성자의 프로토 타입을 나타내는 것이고, 두 번째는 객체의 __proto__ 속성을 직접 수정하는 것이고, 세 번째는 개체를 사용하는 것입니다. 차례로 살펴 보겠습니다.
생성자에 프로토 타입을 지정하십시오
우리는 생성자에서 객체의 프로토 타입을 지정할 수 있습니다.
me = { "firstName": "seek", "lastName": "Truth", "getName": function () {return this.firstName+this.lastName; // 이것은이 개체에 대한 포인터와 동일합니다}} 함수 obj (name) {this.firstName = name; 이것은 .__ proto__ = me; // 프로토 타입을 me 객체로 지정}프로토 타입을 지정한 후 새 개체를 만든 후 프로토 타입의 속성에 액세스 할 수 있습니다.
obj = new obj ( "foo"); // => {FirstName : 'foo'} obj.firstname // => fooobj.lastname // => relitoBj.getName () // => "FootRuth"객체에 액세스 할 때 먼저 수정 된 객체에서 속성을 찾으려고합니다. 그렇지 않은 경우 프로토 타입으로 돌아가서 Object.Prototype까지 검색하십시오. 새 객체의 프로토 타입에서 속성 (메소드)을 다시 작성하면 새로 작성된 속성 (메소드)은 프로토 타입의 정의를 덮어 쓰며 클래스 기반 언어로 기능 과부하와 비슷합니다.
프로토 타입 ME 객체의 마지막 이름 속성이 변경된 경우 OBJ 객체가 프로토 타입의 속성을 찾고 있기 때문에 OBJ 객체의 마지막 이름 속성도 변경됩니다.
me.lastname = "me"obj.lastname // => "me"obj.getname () // => "FOME"
물체의 프로토 타입을 직접 변경하십시오
또한 객체의 프로토 타입을 직접 지정 (변경) 할 수도 있습니다.
obj2 = {} obj2 .__ proto__ = meobj2.firstname // => seekobj2.lastname // => "me"obj2.getname () // => "SeekMe"개체를 사용하십시오
처음 두 가지 방법은 문제를 해결할 수 있지만, JavaScript는 수업 기반 언어가 아니며 첫 번째 글쓰기 방법은 오해하기 쉽기 때문에이 두 가지 방법은 우아하지 않습니다. JavaScript 언어의 본질 저자 인 Crockford는 새로운 것이 JavaScript 언어로 표시되어서는 안되며 개체를 사용하여 프로토 타입을 기반으로 객체를 만드는 것이 좋습니다. 개체의 사용법은 매우 간단합니다.
obj3 = object.create (me) // 프로토 타입 OBJ3.firstName // => seekObj3.lastname // => "me"obj3.getName () // => "SeekMe"로 새 개체를 만듭니다.
OBJ3 = Object.Create (ME)는 OBJ2 = {}; obj2.proto = me와 동일하지만 전자는 더 우아하고 이해하기 쉽습니다.
요약
프로토 타입 기반 및 기능적 프로그래밍 언어로서 JavaScript는 디자인에 많은 우아함과 힘을 가지고 있지만 동시에 많은 드로스와 함정이 있습니다. 가장 중요한 것은 JavaScript도 가장 오해하는 언어입니다. JavaScript의 객체 상속 메커니즘을 배우고 나면 내 레벨이 많이 향상되었다고 생각합니다.
JavaScript 객체와 상속에 대한 위의 간단한 논의는 내가 당신과 공유하는 모든 내용입니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.