JS的继承和接口

来源:互联网 发布:js获取数组索引值 编辑:程序博客网 时间:2024/06/06 07:07

//Test接口var Person = E.createInterface('say', 'eat');var Chinese = function() {};Chinese.prototype.say = function() {alert('说汉语')}Chinese.prototype.eat = function() {alert('吃中餐')}E.implement(Chinese, Person);//Test继承var Instrument = function(name, tone) {this.name = name;this.tone = tone}Instrument.prototype.play = function() {alert(this.name + '的音色:' + this.tone);};var Guitar = function(name, tone) {this.superclass.call(this, name, tone);}Guitar = E.extend(Guitar, Instrument);var fingerGuitar = new Guitar('杉田健司', '高音甜中音稳低音狠 ');fingerGuitar.play();alert(fingerGuitar instanceof Guitar);

实现继承和接口的工具类

/** *  */E = {};E.extend = function(sub, sup) {//借用构造函数sub.prototype = new sup();//保留父类的构造函数,以便在子类构造函数中用调用,将父类变量绑定在this下sub.prototype.superclass = sup;//因为重写了构造函数所以重新指定constructor,以使instanceof表现正常sub.prototype.constructor = sub;//因为已经将变量绑定到子类上,所以删除原型上多余的变量return sub;};//实现类是否实现了所有接口的方法E.implement = function() {var sub = arguments[0];for (var i = 1; i < arguments.length; i++) {var sup = arguments[i];try {sup.implemented(sub);} catch (e) {throw new Error('no implements interface ' + sup);}}};E.factory = {};//创建接口E.createInterface = E.factory.createInterface = function(methods) {var f = typeof arguments[0] === 'string';var p = f ? arguments : arguments[0];var len = p.length;var Interface = function() {};var _proto = Interface.prototype = {};_proto.implemented = function(constructor) {for (var i = 0; i < len; i++) {var obj = new constructor();if(!obj[p[i]]) {throw new Error('no implements interface');}}};return new Interface();};


0 0
原创粉丝点击