대부분의 사람들은 이 문제를 체계적으로 이해하지 못할 수도 있습니다. Javascript 언어는 상속을 잘 구현하지 못하므로 엔지니어는 완전한 상속 메커니즘을 스스로 구현해야 합니다. 아래에서는 더 얕은 시스템에서 더 깊은 시스템으로 JavaScript 상속을 사용하는 기술을 마스터합니다.
1. 프로토타입 체인을 직접 사용
가장 간단하고 조잡한 방법이므로 특정 프로젝트에서는 사용할 수 없습니다. 간단한 데모는 다음과 같습니다:
function SuperType(){ this.property = true; } SuperType.prototype.getSuperValue = function(){ return this.property; } function SubType(){ this.subproperty = false; } //继承 SubType.prototype = new SuperType(); SubType.prototype.getSubValue = function(){ return this.subproperty; } var instance = new SubType();
이 접근 방식의 문제점은 프로토타입의 속성이 모든 인스턴스에서 공유된다는 것입니다. 한 인스턴스를 통해 상속된 속성을 변경하면 다른 인스턴스에 영향을 미칩니다. ,이것은 분명히 전통적인 의미의 상속이 아닙니다.
2. 생성자 사용
생성자는 기본적으로 모든 범위에서 호출할 수 있는 함수일 뿐입니다. 하위 생성자에서 상위 생성자를 호출하면 간단한 상속이 가능합니다.
function SuperType(){ this.colors = {"red","blue","green"} } function SubType(){ SuperType.call(this); } var instance = new SubType();
이 구현은 여러 인스턴스가 속성을 공유하는 문제를 방지하지만 기능을 공유할 수 없고 SuperType의 인스턴스 인스턴스가 false인 등의 새로운 문제가 발생합니다.
3. 프로토타입과 생성자를 함께 사용하세요
function SuperType(name){ this.name = name; this.colors = {"red","blue","green"} } SuperType.prototype.sayName = function(){ //code } function SubType(name,age){ SuperType.call(this,name); this.age = age; } SubType.prototype = new SuperType(); var instance = new SubType();
프로토타입과 생성자를 결합하여 사용하는 것은 JavaScript에서 가장 일반적으로 사용되는 상속 패턴입니다. 이 접근 방식을 사용하면 각 인스턴스가 고유한 속성을 가지며 프로토타입의 메서드를 공유할 수 있습니다. 그러나 이 접근 방식의 단점은 상황에 관계없이 슈퍼클래스 생성자가 두 번 호출된다는 것입니다. 한 번은 서브클래스 프로토타입을 생성할 때이고 다른 한 번은 서브클래스 생성자 내부에서입니다. 이 문제를 해결하는 방법?
4. 기생 결합 상속
SubType의 프로토타입은 SuperType의 인스턴스일 필요는 없으며 생성자 프로토타입이 SuperType의 프로토타입인 일반 개체이면 됩니다. Douglas Crockford가 수행하는 방법은 다음과 같습니다.
function obejct(o){ function F(){}; F.prototype = o; return new F(); }
사실 이는 ES5의 Object.create 구현입니다. 그런 다음 이 문서의 세 번째 옵션을 수정할 수 있습니다.
function inheritPrototype(subType,superType){ var prototype = object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } function SuperType(name){ this.name = name; this.colors = {"red","blue","green"} } SuperType.prototype.sayName = function(){ //code } function SubType(name,age){ SuperType.call(this,name); this.age = age; } inheritPrototype(SubType,SuperType); var instance = new SubTYpe();
사실 기생 결합 상속은 이미 아주 좋은 상속 구현 메커니즘이므로 매일 사용하기에 충분합니다. 더 높은 요구 사항을 제시하면 어떻게 될까요? 예를 들어 하위 클래스에서 상위 클래스의 메서드를 호출하는 방법은 무엇입니까?
5.단순 상속 라이브러리 구현
이렇게 이해하기 어려운 코드를 보며 처음에는 거부했지만, 더 깊이 들어가고 나니 훌륭한 사람은 훌륭한 사람이고, 미묘한 아이디어는 어디에나 있다는 것을 깨달았습니다. 모든 코드 줄에 대해 자세한 설명이 있습니다. 세부 사항을 알고 싶다면 자세히 연구하고 모든 줄을 읽으십시오. 이 구현에서 가장 절묘한 부분은 요청에 따라 부모 클래스 메서드를 다시 작성한다는 점이라고 생각합니다. 인스턴스 객체에서는 Java 구현과 마찬가지로 _super를 통해 부모 클래스와 동일한 이름의 메서드를 호출할 수 있습니다.
(function(){ //initializing用于控制类的初始化,非常巧妙,请留意下文中使用技巧 //fnTest返回一个正则比表达式,用于检测函数中是否含有_super,这样就可以按需重写,提高效率。当然浏览器如果不支持的话就返回一个通用正则表达式 var initializing = false,fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; //所有类的基类Class,这里的this一般是window对象 this.Class = function(){}; //对基类添加extend方法,用于从基类继承 Class.extend = function(prop){ //保存当前类的原型 var _super = this.prototype; //创建当前类的对象,用于赋值给子类的prototype,这里非常巧妙的使用父类实例作为子类的原型,而且避免了父类的初始化(通过闭包作用域的initializing控制) initializing = true; var prototype = new this(); initializing = false; //将参数prop中赋值到prototype中,这里的prop中一般是包括init函数和其他函数的对象 for(var name in prop){ //对应重名函数,需要特殊处理,处理后可以在子函数中使用this._super()调用父类同名构造函数, 这里的fnTest很巧妙:只有子类中含有_super字样时才处理从写以提高效率 prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name])? (function(name,fn){ return function(){ //_super在这里是我们的关键字,需要暂时存储一下 var tmp = this._super; //这里就可以通过this._super调用父类的构造函数了 this._super = _super[name]; //调用子类函数 fn.apply(this,arguments); //复原_super,如果tmp为空就不需要复原了 tmp && (this._super = tmp); } })(name,prop[name]) : prop[name]; } //当new一个对象时,实际上是调用该类原型上的init方法,注意通过new调用时传递的参数必须和init函数的参数一一对应 function Class(){ if(!initializing && this.init){ this.init.apply(this,arguments); } } //给子类设置原型 Class.prototype = prototype; //给子类设置构造函数 Class.prototype.constructor = Class; //设置子类的extend方法,使得子类也可以通过extend方法被继承 Class.extend = arguments.callee; return Class; } })();
단순 상속 라이브러리를 사용하면 매우 간단한 방법으로 상속을 구현할 수 있습니다. 특히 강력한 형식의 언어 상속과 비슷하다고 생각하시나요?
var Human = Class.extend({ init: function(age,name){ this.age = age; this.name = name; }, say: function(){ console.log("I am a human"); } }); var Man = Human.extend({ init: function(age,name,height){ this._super(age,name); this.height = height; }, say: function(){ this._super(); console.log("I am a man"); } }); var man = new Man(21,'bob','191'); man.say();
Javascript 상속 메커니즘과 단순 상속 소스 코드 분석을 얕은 것부터 더 깊은 것까지 설명합니다. 이 글을 공유하는 것이 모든 사람에게 도움이 되기를 바랍니다.

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.

이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.

JavaScript는 현대 웹 개발의 핵심 언어이며 다양성과 유연성에 널리 사용됩니다. 1) 프론트 엔드 개발 : DOM 운영 및 최신 프레임 워크 (예 : React, Vue.js, Angular)를 통해 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축합니다. 2) 서버 측 개발 : Node.js는 비 차단 I/O 모델을 사용하여 높은 동시성 및 실시간 응용 프로그램을 처리합니다. 3) 모바일 및 데스크탑 애플리케이션 개발 : 크로스 플랫폼 개발은 개발 효율을 향상시키기 위해 반응 및 전자를 통해 실현됩니다.

JavaScript의 최신 트렌드에는 Typescript의 Rise, 현대 프레임 워크 및 라이브러리의 인기 및 WebAssembly의 적용이 포함됩니다. 향후 전망은보다 강력한 유형 시스템, 서버 측 JavaScript 개발, 인공 지능 및 기계 학습의 확장, IoT 및 Edge 컴퓨팅의 잠재력을 포함합니다.

JavaScript는 현대 웹 개발의 초석이며 주요 기능에는 이벤트 중심 프로그래밍, 동적 컨텐츠 생성 및 비동기 프로그래밍이 포함됩니다. 1) 이벤트 중심 프로그래밍을 사용하면 사용자 작업에 따라 웹 페이지가 동적으로 변경 될 수 있습니다. 2) 동적 컨텐츠 생성을 사용하면 조건에 따라 페이지 컨텐츠를 조정할 수 있습니다. 3) 비동기 프로그래밍은 사용자 인터페이스가 차단되지 않도록합니다. JavaScript는 웹 상호 작용, 단일 페이지 응용 프로그램 및 서버 측 개발에 널리 사용되며 사용자 경험 및 크로스 플랫폼 개발의 유연성을 크게 향상시킵니다.

Python은 데이터 과학 및 기계 학습에 더 적합한 반면 JavaScript는 프론트 엔드 및 풀 스택 개발에 더 적합합니다. 1. Python은 간결한 구문 및 풍부한 라이브러리 생태계로 유명하며 데이터 분석 및 웹 개발에 적합합니다. 2. JavaScript는 프론트 엔드 개발의 핵심입니다. Node.js는 서버 측 프로그래밍을 지원하며 풀 스택 개발에 적합합니다.


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

WebStorm Mac 버전
유용한 JavaScript 개발 도구

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

Dreamweaver Mac版
시각적 웹 개발 도구

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기
