Js中的类式继承

  类式继承对于大部分开发者来说都已经熟悉,只要有了带方法(method)的类(class)就可以把他们实例化(instantiate)为对象.

  下面就有一个简单的方法来模拟类式继承.代码清单如下:

  <script>

复制代码
    //辅助函数 定义
    Function.prototype.method = function( name,func ){
        
this.prototype[name] = func;
         
return this;    
    }
    
    
//实现函数
    Function.method('inherits'function(parent){
        
//记录我们目前所在父层次的级数
        var depth = 0;
        
//继承父对象的方法
        var proto = this.prototype = new parent();
        
        
//特权函数
        this.method('uber'function uber(name){
            
var func;
            
var ret;
            
var v = parent.prototype;
            
//如果我们已经在某个 'uber' 函数之内
            if(depth){
                
for (var i=d; i>0;i+=1) {
                    v 
= v.constructor.prototype;
                };
                
//从该prototype中或得函数
                func = v[name];
            }
            
else{
                
//从prototype获得要执行的函数
                func = prototype[name];
                
                
//如果此函数属于当前的prototype
                if( func == this[name]){
                    
//则改为调用父对象的prototype
                    func = v[name];
                }
            }
            
//记录我们在继承堆栈中所在位置的级数
            depth += 1;
            
            
//
            ret = func.apply(this,Array.prototype.slice.apply(arguments,[1]));
            
            
//恢复继承堆栈
            depth -= 1;
            
            
return ret;
        });
        
return this;
    })
    
//只继承父对象特定函数的函数
    Function.method('swiss',function(parent){
        
for (var i=1; i<arguments.length; i++) {
            
var name = arguments[i];
            
//将此方法导入this对象的prototype
            this.prototype[name] = parent.prototype[name];
        };
        
return this;
    })
        
function Person( name ){
        
this.name = name;
    }
    
    
//实现的例子
    Person.method('getName'function(){
        
return name;
    })
    
function  User( name, password ){
        
this.name = name;
        
this.password = password; 
    }
    User.inherits( Person );
</script>
复制代码

 

 

   下面重点讲解一下,上面的三个函数

  1.Function.prootype.method:它提供了一个简单的方法,把函数与构造函数的原型关联起来;之所以有效,是因为所有的构造函数本身都是函数,所以能获得"method"这个新方法;

  来自:小贺 

  2.Function.prototype.inherite: 这一函数可以提供简单的对象继承,他的代码主要围绕在任意方法中调用this.uber('methodName')为中心,并在让这个uber方法去执行他要覆盖的父对象.这是javascript继承模型中并未内建的部分.

  3. Functon.prototype.swiss:这是.method()函数的增强版,可以用于从单一父对象获取多个函数.如果用在多个父对象上就能能获得可用的多对象继承.

   

posted @   hevily  Views(639)  Comments(5Edit  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示