Extjs가 상속을 구현하는 함수는 매우 핵심적인 함수인 Ext.extend입니다. 확장 메소드에는 두 개의 재구성된 버전이 있습니다. 첫 번째는 두 개의 매개변수를 허용하며, 첫 번째는 확장(Function superclass, Object overrides)이고 두 번째는 확장입니다. (함수 하위 클래스, 함수 상위 클래스, 개체 재정의): 함수, 두 번째 버전은 하위 클래스를 기반으로 합니다. Superclass는 슈퍼클래스의 생성자이고 overrides는 객체이며 내부 속성은 상위 클래스의 속성을 재정의하기 위한 것입니다. 상위 클래스를 상속하는 하위 클래스에는 상위 클래스의 프로토타입에 있는 모든 메서드가 포함됩니다. 그리고 하위 클래스는 상위 클래스의 메서드를 재정의(override)할 수 있습니다. 또한 하위 클래스의 각 객체도 상위 클래스의 메서드를 재정의할 수 있습니다. 사실 이 함수는 프로토타입을 수정하는 것과 같은 효과가 있다고 생각합니다. 물론 extjs의 목적은 프로토타입의 마법적인 것을 완전히 보호하여 프로그래머가 다른 언어처럼 Javascript를 처리할 수 있도록 하는 것입니다. 물론, 그럼에도 불구하고 상속은 여전히 일반적인 상속과 다소 다릅니다. 먼저 예를 살펴보고 Person 클래스를 준비하겠습니다.
Person = function(name) { this.name = name; this.fn = function() { alert('I am a person') }; } Person.prototype.print=function(){ alert('I am a person');} Person.prototype.showAge = function() { alert('I am older than 0'); } Person.prototype.showName = function() { alert('Show Name:'+this.name) }; var per = new Person('Tom'); per.showName();子类:Student = function(id) { this.id = id; } Student.prototype.showID = function() { alert(this.id); } //子类的方法
Inheritance:
Ext.extend(Student, Person); ) ; !!결과가 없습니다! stu에는 이름 stu.fn();에 대한 정의가 없습니다. !!결과가 없습니다. stu.showID(); 여전히 결과가 없습니다. 이 시점에서 우리는 몇 가지 차이점을 발견했습니다. 상위 클래스의 생성자에 있는 내용은 상속되지 않습니다. . 을 사용하면 상위 클래스의 생성자가 호출되지 않으며 프로토타입에 있는 하위 클래스의 기존 메서드도 손실됩니다. 계속해서 읽고 Ext.extend 아래의 코드를 다음으로 바꾸세요.
var stu = new Student('01'); Student.override({ print: function() { alert('I am a student'); } }); stu.override({ print: function() { alert('I am a bad student,but I won\'t affect others'); } }); stu.print(); stu.showAge(); var stu2 = new Student(); stu2.print();
// inline overrides var io = function(o){ //注意这个方法的this,仅看这里并不知道这个this是什么,下面这个io会被赋值给sbp.override,也就是子类的prototype for(var m in o){ //从而每个子类的对象的override都会指向这个方法,如果子类对象调用了override,那么这个this就是子类的对象了。也就是 this[m] = o[m]; //上面的例子中stu.override表现出来的效果,仅对当前对象有效。从这里可以看出,override不仅仅是传统意义上的覆盖,完全也可以 } //用来添加新方法。 }; var oc = Object.prototype.constructor; return function(sb, sp, overrides){ if(Ext.isObject(sp)){ //是在检测当前使用的是哪个版本的重构函数。如果sp实际上是overrides,就做些替换工作,让变量的实际意义和名称相符合。 overrides = sp; sp = sb; sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);}; //这个没看懂…… } var F = function(){}, sbp, spp = sp.prototype; F.prototype = spp; //F是父类的一个“干净”拷贝,所谓干净,是指它不会把父类中在构造函数内部定义的属性带过来。 //例如 Person=function() // {this.privateFn=new function{ some code goes here}} //那么这个privateFn对子类是不可见的,所以在构造函数中利用this定义的属性都相当于是类的私有变量。 sbp = sb.prototype = new F(); //将子类的prototype设置为父类的prototype,继承的核心步骤。 sbp.constructor=sb; //设置正确的构造函数指向,见 JavaScript继承详解 sb.superclass=spp; //设置父类 if(spp.constructor == oc){ //没看懂……,这个是干嘛用的?望高人指点 spp.constructor=sp; } sb.override = function(o){ //子类的重写方法,这个重写方法是函数的重写方法。它修改的是prototype。 Ext.override(sb, o); //见最后。 }; sbp.superclass = sbp.supr = (function(){ //设置原型的父类 return spp; }); sbp.override = io; //给子类的prototype提供override方法,这样单个实体也可以覆盖,它修改的是实体对象。注意和上面的sb的override区分。 Ext.override(sb, overrides); //重写 sb.extend = function(o){return Ext.extend(sb, o);}; //给子类提供extend方法,以实现多重继承 return sb; //返回子类。 }; }();
function(origclass, overrides){ if(overrides){ var p = origclass.prototype; Ext.apply(p, overrides); if(Ext.isIE && overrides.hasOwnProperty('toString')){ // 这个是什么?IE的特殊点? p.toString = overrides.toString; } } }
위 내용은 javascript가 extjs 이벤트를 구현하는 방법에 대한 기본 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!