간단한 자바스크립트 클래스 프레임워크 소개_기본지식
진행 중인 JavaScript 책을 집필할 때 JavaScript 상속 시스템에 대해 상당한 시간을 보냈고 그 과정에서 클래식 클래스 상속을 시뮬레이션하기 위한 다양한 솔루션을 연구했습니다. 이러한 기술 솔루션 중에서 제가 가장 존경하는 것은 base2와 Prototype의 구현입니다.
이러한 솔루션에서 이념적 의미를 지닌 프레임워크를 추출해야 합니다. 프레임워크는 단순하고 재사용 가능하며 이해하기 쉽고 단순성과 유용성이 핵심입니다. 사용 예는 다음과 같습니다.
var Person = Class. extend ( { init: function (isDancing ) { this. dancing = isDancing; }, dance: function ( ) { return this. dancing; } } ); var Ninja = Person.extend({ init: function(){ this._super( false ); }, dance: function(){ // Call the inherited version of dance() return this._super(); }, swingSword: function(){ return true; } }); var p = new Person(true); p.dance(); // => true var n = new Ninja(); n.dance(); // => false n.swingSword(); // => true // Should all be true p instanceof Person && p instanceof Class && n instanceof Ninja && n instanceof Person && n instanceof Class
몇 가지 주의할 사항이 있습니다.
- 생성자는 단순해야 합니다(init 함수를 통해 구현됨).
- 새로 정의된 비유는 기존 클래스 에서 상속되어야 합니다.
- 모든 '클래스'는 상위 클래스인 Class에서 상속되므로 새로운 클래스를 만들려면 해당 클래스는 Class의 하위 클래스여야 합니다.
- 가장 어려운 점: 상위 클래스의 재정의된 메서드에 액세스할 수 있어야 합니다(구성 컨텍스트를 통해).
- 위의 예에서는 Person 상위 클래스의 init() 및 dance() 메서드가 this._super()를 통해 호출되는 것을 확인할 수 있습니다.
결과에 매우 만족합니다. 클래스 정의를 구조화하고 단일 상속을 유지하며 슈퍼클래스 메서드를 호출할 수 있었습니다.
간단한 클래스 생성 및 상속
다음은 약 25줄의 구현입니다(읽기 쉽고 주석 있음). 제안을 환영하며 감사드립니다.
/* Simple JavaScript Inheritance * By John Resig http://ejohn.org/ * MIT Licensed. */ // Inspired by base2 and Prototype ( function ( ) { var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; // The base Class implementation (does nothing) this.Class = function(){}; // Create a new Class that inherits from this class Class.extend = function(prop) { var _super = this.prototype; // Instantiate a base class (but only create the instance, // don't run the init constructor) initializing = true; var prototype = new this(); initializing = false; // Copy the properties over onto the new prototype for (var name in prop) { // Check if we're overwriting an existing function prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function(name, fn){ return function() { var tmp = this._super; // Add a new ._super() method that is the same method // but on the super-class this._super = _super[name]; // The method only need to be bound temporarily, so we // remove it when we're done executing var ret = fn.apply(this, arguments); this._super = tmp; return ret; }; })(name, prop[name]) : prop[name]; } // The dummy class constructor function Class() { // All construction is actually done in the init method if ( !initializing && this.init ) this.init.apply(this, arguments); } // Populate our constructed prototype object Class.prototype = prototype; // Enforce the constructor to be what we expect Class.prototype.constructor = Class; // And make this class extendable Class.extend = arguments.callee; return Class; }; })();
그 중에서 "초기화/init 호출 안 함"과 "_super 메소드 생성"이 가장 어렵습니다. 다음으로, 모든 사람이 구현 메커니즘을 더 잘 이해할 수 있도록 이에 대해 간략하게 소개하겠습니다.
초기화
함수 프로토타입 상속 방법을 설명하기 위해 먼저 하위 클래스의 프로토타입 속성을 상위 클래스의 인스턴스를 가리키는 전통적인 구현 프로세스를 살펴보겠습니다. 아래와 같이:
function Person ( ) { } function Ninja ( ) { } Ninja. prototype = new Person ( ); // Allows for instanceof to work: (new Ninja()) instanceof Person
그러나 여기서 어려운 점은 Person을 인스턴스화하고 생성자를 호출하는 결과 없이 'instatnceOf'의 효과만 얻고자 한다는 것입니다. 이를 방지하려면 코드에서 초기화하는 bool 매개 변수를 설정합니다. 이 매개 변수의 값은 부모 클래스가 인스턴스화되고 자식 클래스의 프로토타입 속성으로 구성된 경우에만 true가 됩니다. 이 처리의 목적은 실제 인스턴스화 중에 생성자를 호출하는 것과 디자인 상속 중에 생성자를 호출한 다음 실제 인스턴스화 중에 init 메서드를 호출하는 것의 차이점을 구별하는 것입니다.
if ( !initializing ) this.init.apply(this, arguments);
init 함수에서는 상당히 리소스 집약적인 코드(예: 서버 연결, DOM 요소 생성 등 누구도 예측할 수 없음)가 실행될 수 있으므로 특별히 주의할 가치가 있으므로 반드시 필요합니다. 구별을 하기 위해서입니다.
슈퍼 메소드
상속을 사용할 때 가장 일반적인 요구 사항은 하위 클래스가 상위 클래스의 재정의된 메서드에 액세스할 수 있어야 한다는 것입니다. 이 구현에서 최종 해결책은 슈퍼클래스 메서드를 가리키고 하위 클래스 메서드에서만 액세스할 수 있는 임시 메서드(._super)를 제공하는 것입니다.
var Person = Class. extend ( { init: function (isDancing ) { this. dancing = isDancing; } } ); var Ninja = Person.extend({ init: function(){ this._super( false ); } }); var p = new Person(true); p.dancing; // => true var n = new Ninja(); n.dancing; // => false
이 기능을 구현하려면 여러 단계가 필요합니다. 먼저, 기본 Person 인스턴스(위에서 언급한 생성 프로세스가 있는 클래스 인스턴스)를 리터럴 객체(Person.extend()의 함수 매개변수)와 병합하기 위해 확장을 사용합니다. 병합 프로세스 중에 간단한 검사가 이루어졌습니다. 먼저 병합할 속성이 함수인지 확인하고, 그렇다면 덮어쓸 슈퍼클래스 속성도 함수인지 확인하세요. 두 검사가 모두 true인 경우 이 속성에 대한 _super 메서드를 준비해야 합니다.
여기서 추가된 슈퍼 메소드를 캡슐화하기 위해 익명 클로저(함수 객체 반환)가 생성되었습니다. 실행 환경을 유지해야 할 필요성에 따라 함수가 실행된 후 재설정되도록 이전 this._super를 저장해야 합니다. 이는 동일한 이름이 있는 경우(원하지 않는 경우)에 도움이 됩니다. 실수로 개체 포인터를 잃어버렸습니다.) 예측할 수 없는 문제입니다.
그런 다음 슈퍼 클래스에서 재정의된 메서드만 가리키는 새로운 _super 메서드를 만듭니다. 다행스럽게도 _super를 변경하거나 범위를 변경할 필요가 없습니다. 함수의 실행 환경이 함수 호출 객체(포인터가 슈퍼 클래스를 가리킬 것임)에 따라 자동으로 변경되기 때문입니다.
마지막으로 리터럴 객체의 메서드를 호출합니다. 메서드 실행 중에 This._super()를 사용할 수 있습니다. 메서드가 실행된 후 _super 속성이 원래 상태로 재설정된 다음 함수를 종료합니다.
동일한 효과를 얻는 방법은 여러 가지가 있지만(이전에 super를 자체적으로 바인딩한 다음 인수.callee를 사용하여 액세스하는 것을 본 적이 있습니다), 이 방법이 유용성과 단순성의 특성을 가장 잘 반영한다고 생각합니다.
제가 완성한 JavaScript 프로토타입을 기반으로 한 많은 작업 중 여러분과 공유하기 위해 게시한 유일한 클래스 상속 구현 계획은 이것이었습니다. 간결한 코드(배우기 쉽고, 상속하기 쉽고, 다운로드가 적음)가 모든 사람이 논의할 수 있도록 제시되어야 한다고 생각합니다. 따라서 JavaScript 클래스 구성 및 상속을 배우는 사람들에게는 이 구현 계획이 좋은 시작입니다.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java 프레임워크에 대한 상용 지원의 비용/성능 평가에는 다음 단계가 포함됩니다. 필요한 보증 수준과 SLA(서비스 수준 계약) 보장을 결정합니다. 연구지원팀의 경험과 전문성. 업그레이드, 문제 해결, 성능 최적화와 같은 추가 서비스를 고려하십시오. 위험 완화 및 효율성 향상을 기준으로 비즈니스 지원 비용을 평가합니다.

PHP 프레임워크의 학습 곡선은 언어 숙련도, 프레임워크 복잡성, 문서 품질 및 커뮤니티 지원에 따라 달라집니다. PHP 프레임워크의 학습 곡선은 Python 프레임워크에 비해 높고 Ruby 프레임워크에 비해 낮습니다. Java 프레임워크에 비해 PHP 프레임워크는 학습 곡선이 적당하지만 시작하는 데 걸리는 시간이 더 짧습니다.

경량 PHP 프레임워크는 작은 크기와 낮은 리소스 소비를 통해 애플리케이션 성능을 향상시킵니다. 그 특징은 다음과 같습니다: 작은 크기, 빠른 시작, 낮은 메모리 사용량, 향상된 응답 속도 및 처리량, 리소스 소비 감소 실제 사례: SlimFramework는 500KB에 불과한 REST API를 생성하며 높은 응답성과 높은 처리량을 제공합니다.

벤치마크에 따르면 소규모 고성능 애플리케이션의 경우 Quarkus(빠른 시작, 낮은 메모리) 또는 Micronaut(TechEmpower 우수)가 이상적인 선택입니다. SpringBoot는 대규모 풀 스택 애플리케이션에 적합하지만 시작 시간과 메모리 사용량이 약간 느립니다.

Golang 프레임워크에서는 명확하고 포괄적인 문서를 작성하는 것이 중요합니다. 모범 사례에는 Google의 Go 코딩 스타일 가이드와 같은 확립된 문서 스타일을 따르는 것이 포함됩니다. 제목, 부제, 목록 등 명확한 조직 구조를 사용하고 탐색 기능을 제공하세요. 시작 안내서, API 참조 및 개념을 포함하여 포괄적이고 정확한 정보를 제공합니다. 코드 예제를 사용하여 개념과 사용법을 설명합니다. 문서를 계속 업데이트하고, 변경 사항을 추적하고, 새로운 기능을 문서화하세요. GitHub 문제 및 포럼과 같은 지원 및 커뮤니티 리소스를 제공합니다. API 문서와 같은 실용적인 예제를 만듭니다.

애플리케이션 시나리오를 기반으로 최고의 Go 프레임워크를 선택하세요. 애플리케이션 유형, 언어 기능, 성능 요구 사항 및 생태계를 고려하세요. Common Go 프레임워크: Gin(웹 애플리케이션), Echo(웹 서비스), Fiber(높은 처리량), gorm(ORM), fasthttp(속도). 실제 사례: REST API(Fiber) 구축 및 데이터베이스(gorm)와 상호 작용. 프레임워크를 선택하세요. 주요 성능을 위해서는 fasthttp를 선택하고, 유연한 웹 애플리케이션을 위해서는 Gin/Echo를, 데이터베이스 상호작용을 위해서는 gorm을 선택하세요.

Go 프레임워크 학습에는 다섯 가지 오해가 있습니다. 프레임워크에 대한 과도한 의존과 제한된 유연성입니다. 프레임워크 규칙을 따르지 않으면 코드를 유지 관리하기가 어려워집니다. 오래된 라이브러리를 사용하면 보안 및 호환성 문제가 발생할 수 있습니다. 패키지를 과도하게 사용하면 코드 구조가 난독화됩니다. 오류 처리를 무시하면 예기치 않은 동작과 충돌이 발생합니다.

Go 프레임워크 개발에서 일반적인 과제와 해결 방법은 다음과 같습니다. 오류 처리: 관리에는 오류 패키지를 사용하고 중앙에서 오류를 처리하려면 미들웨어를 사용합니다. 인증 및 권한 부여: 타사 라이브러리를 통합하고 사용자 정의 미들웨어를 생성하여 자격 증명을 확인합니다. 동시 처리: 고루틴, 뮤텍스 및 채널을 사용하여 리소스 액세스를 제어합니다. 단위 테스트: 격리를 위해 getest 패키지, 모의 및 스텁을 사용하고, 충분성을 보장하기 위한 코드 적용 도구를 사용합니다. 배포 및 모니터링: Docker 컨테이너를 사용하여 배포를 패키징하고, 데이터 백업을 설정하고, 로깅 및 모니터링 도구를 사용하여 성능과 오류를 추적합니다.
