javascript OOP:实现继承、多态与封装

2016-02-19 20:32 9 1 收藏

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的javascript OOP:实现继承、多态与封装懂设计的网友们快点来了解吧!

【 tulaoshi.com - Web开发 】

  代码是随手写的,只提供思路。

  这个原理很简单,看代码就懂,不多说了。

(function (){
var h = 0;
handle = function (){return h++};
var f = function (){};
extend = function (a, b){
    f.prototype = a;
    var ret = new f;
    if (typeof b == 'function') {
        b.call(ret);
    } else if (typeof b == 'object') {
        for (var key in b) {
            ret[key] = b[key];
        }
    }
    return ret;
};
})();

(function (){
ClassA = function (){
    this.hello = 'world';
};
ClassA.virtualmethod = handle();
ClassA.prototype = extend({}, function (){
    this.virtualmethod = function (){
        var impl = this[ClassA.virtualmethod];
        if (impl) {
            impl.apply(this, arguments);
        } else {
            alert('ClassA.virtualmethod not yet impl.');
        }
    };
});
})();

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

(function (){ // ClassB extend ClassA
ClassB = function (){
    ClassA.apply(this, arguments);
};

// 继承性
ClassB.prototype = extend(ClassA.prototype, function (){
    this[ClassA.virtualmethod] = function (){
        alert('this is ClassA.virtualmethod, impl in ClassB.will show this.hello.');
        alert('this.hello = ' + this.hello);
    }
   
    // 封装性
    this.test = this.virtualmethod;
    this.virtualmethod = undefined;
});
})();

(function (){ // ClassC extend ClassB
ClassC = function (){
    ClassB.apply(this, arguments);
};

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

ClassC.prototype = extend(ClassB.prototype, function (){
    // 多态性
    var impl = this[ClassA.virtualmethod];
    this[ClassA.virtualmethod] = function (){
        alert('this is ClassA.virtualmethod, impl in ClassC. will run ClassB's impl.');
        impl.apply(this, arguments);
    };
});
})();

// test case
var a = new ClassA;
a.virtualmethod(); // not yet impl

var b = new ClassB;
b.test();
alert('b.virtualmethod is: '+b.virtualmethod);

var c = new ClassC;
c.test();

来源:http://www.tulaoshi.com/n/20160219/1623963.html

延伸阅读
  function Person_mfGetName()   {   return this.m_strName;   }   var MyPerson=new Person();   MyPerson.GetName();   你可以用任何输出语句来查看结果。当然这只是第一步!   下面是关键一步:继承!   function Student() // Extends Class: Person   {   EXTENDS: // 我的...
标签: Web开发
JavaScript中类的学习,从基本类继承过来方法 也可以这样实现: Java代码 function newClass(){         this.firstName="frank";         this.toUc=String.toUpperCase;         this.toString=function()...
在过去的学习中,我们始终接触的单个类的继承,但是在现实生活中,一些新事物往往会拥有两个或者两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念, C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承 。 举个例子,交通工具类可以派生出汽车和船连个子类,但拥有汽车和船共同特性水陆两用汽车就必须继承来...
标签: Web开发
需要写个滑动展开折叠的效果,搜索到无忧脚本的一篇贴子,稍加修改了下使其在FF也可应用,代码如下: 以下是引用片段: script type="text/javascript" //Url: http://bbs.51js.com/thread-61646-1-1.html //Author: 风云突变 //Modify: 枫岩 var act; function over(s,nMax){   var obj=document.getElementById(s);  ...
标签: Web开发
代码如下: function CallBackObject() { this.XmlHttp = this.GetHttpObject(); } CallBackObject.prototype.GetHttpObject = function() //动态为CallBackObject的原型添加了GetHttpObject共有方法 { //第一步:创建XMLHttpRequest对象 //进行兼容性判断 var xmlhttp; /*@cc_on @if (@_jscript_version = 5) try { xmlhttp = ne...

经验教程

962

收藏

69
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部