`
ohunbeyond
  • 浏览: 17589 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

我对js类继承的尝试

阅读更多
/**
 *
 * 用于类继承
 * User: yxx
 * Date: 10-4-14
 * Time: 上午11:01
 */
var Class = function (window) {
    function apply(o, c) {
        if (o && c && typeof c == 'object') {
            for (var p in c) {
                o[p] = c[p];
            }
        }
        return o;
    }
    /**
     *顶层基类
     */
    function Base() {
    }

    Base.superClass = Object;
    Base.prototype.is = function (type) {
        return this instanceof type;
    };

    /**
     * 在构造函数中使用,类似java语法中的super
     * 如果父类中也调用了Super则递归下去只到Base
     * 调用Super等this.constructor.superClass.apply(this, arguments);
     * ps:由于super是关键字所以首字母大写
     * @param args
     */
    Base.prototype.Super = function (args) {
        this.__super__ = (this.__super__ || this.constructor).superClass;//取得父类构造函数
        this.__super__.apply(this, arguments);//执行父类构造函数
        delete this.__super__;
    };

    /**
     * 继承一个类
     * @param supClass  父类
     * @param instances 实例方法和属性
     * @param statics 静态方法和属性
     */
    function extend(supClass, instances, statics) {
        if (typeof supClass != "function") {
            statics = instances;
            instances = supClass;
            supClass = Base;
        } else if (supClass == Object) {
            supClass = Base;
        } else if (!supClass.superClass) {
            supClass.extend(Base, supClass.prototype);
        } else {
            delete this.extend;
        }
        var spp = supClass.prototype;

        function PC() {//子类原型构造函数(prototype constructor)
        }

        PC.prototype = spp;//从父类继承实例方法和属性
        this.prototype = new PC();// 连接原型链完成继承
        apply(this.prototype, instances);// 绑定实例方法和属性
        apply(this, statics);// 绑定静态方法和属性
        this.superClass = supClass;// 父类
        this.prototype.superClass = spp;// 父类(原形)
        this.prototype.constructor = this;
    }


    function create(supClass, instances, statics) {
        var C = instances && instances.constructor;// 构造函数
        if (C == Object || typeof C != "function") {
            C = function Constructor() {
            };
        } else if (typeof instances == "function") {
            C = instances;
        }

        C.extend = extend;//为了不污染基础类没有把该方法直接绑定到Function.prototype上
        C.extend(supClass, instances, statics);
        return C;
    }

    return {
        create:create,
        extend:function(supClass,subClass, instances, statics){
            extend.call(subClass,supClass,instances,statics);
        }
    }
}(window);

//1.直接创建一个类默认继承Base
var Person = Class.create({constructor:function (name, age){
	this.name = name;
	this.age = age;
}});
//2.创建一个类并继承Pesson.
var User = Class.create(Person,function (name, age,sex){
	this.Super(name, age);
	this.sex = sex;
});

//3.构造函数,
function Teacher(name, age,sex){
      this.Super(name, age);
      this.sex = sex;
}
//继承Pesson
Class.extend(Person,Teacher);

//3.直接创建一个类默认继承Base
var Stu = Class.create({
      constructor:function (name, age,sex,no){
	 this.Super(name, age,sex);
	 this.no = no;
      },
      getAge:function(){
         return this.age;
      }
});

//更改父类为User.只有默认继承的父类为Base时才可以更改父类且只能改一次
Stu.extend(User);


//test
var p = new Person("张三",20);
var u = new User("李四",40,"女");
var s = new Stu("凤姐",70,男","10001");
alert(p.name);
alert(u.name);
alert(s.name);
alert(s.getAge());
alert(s.superClass.age);//访问被覆盖的父类属性或方法

alert(p instanceof Person);
alert(u instanceof Person);
alert(s instanceof Person);
alert(s instanceof User);

有什么意见好的想法大家一起改进
分享到:
评论

相关推荐

    Javascript编程 类的继承及封装:Class

    笔者历经多年javascript的开发,痛彻体会javascript面向对象编程的不便性,精心制作了一个类的定义与继承功能的js,实现了在javascript中对类的定义、继承、封装机制,主要功能特征包括:  一、 统一了类定义的语法...

    JavaScript中的继承之类继承_.docx

    ### JavaScript中的继承——类继承 #### 一、引言 JavaScript是一种动态的、弱类型的编程语言,它支持面向对象编程模式。与传统的面向对象语言如Java或C#不同,JavaScript的继承模型基于原型,这使得它的继承机制...

    js继承的用法

    根据提供的文件信息,我们可以分析并总结出关于JavaScript继承的一些关键知识点。尽管提供的代码示例主要关注于使用jQuery插件初始化一个表格(grid),但这里我们将重点放在如何在JavaScript中实现继承这一主题上。...

    JS 继承类 原型链

    JavaScript(JS)是一种广泛用于网页和网络应用的脚本语言,尤其在前端开发中起着核心作用。在JS中,对象的继承是实现代码复用和构建复杂应用程序的关键机制。继承允许一个对象(子对象)从另一个对象(父对象或基...

    js继承实现示例代码

    ### JavaScript继承实现示例 #### 知识点概述 在JavaScript中,继承是一种常见的对象间关系,它允许一个对象(子类)继承另一个对象(父类或超类)的属性和方法。通过继承,可以复用代码、提高程序的可维护性,并...

    JS继承--原型链继承和类式继承

    JavaScript中的继承机制是实现代码复用和面向对象编程的关键特性。本文主要探讨了两种常见的继承方式:原型链继承和类式继承。 1. **原型链继承**: 原型链继承是JavaScript中实现继承的基本方式,它依赖于原型(`...

    javascript继承实例

    本篇文章将深入探讨JavaScript继承的实例,以及如何通过继承来提高代码的可维护性和效率。 首先,我们需要了解JavaScript中的原型(prototype)机制。每个JavaScript对象都有一个内部属性[[Prototype]],通常通过`_...

    16-1【SV精通3】类的方法和继承_动态对象_包的使用.zip

    在学习过程中,实践是关键,尝试创建自己的类,实现继承关系,使用不同包中的类,你将对这些概念有更深入的理解。同时,不断探索和学习新的编程技术,保持对编程的热情,将有助于你在IT行业中取得成功。

    JavaScript继承与多继承实例分析.docx

    1. **JavaScript继承** - **原理**:JavaScript的继承主要是通过原型链(prototype chain)来实现的。每个JavaScript对象都有一个内部属性[[Prototype]],通常可以通过`__proto__`访问,或通过`Object....

    理解Javascript原型继承原理

    ### 理解Javascript原型继承原理 #### 一、引言 在JavaScript中,原型继承是一种非常核心且独特的机制,它使得对象能够继承其他对象的属性和方法。本文旨在深入探讨这一机制,并通过具体的示例代码帮助读者更好地...

    Js继承深讨.docx

    JavaScript中的继承是面向对象编程的重要概念,它允许创建新的对象类,这些类可以从现有类继承属性和方法。本文将深入探讨JavaScript中常见的两种继承实现方式:`prototype`方式和`apply`方式,并分析它们的优缺点。...

    javascript类式继承新的尝试

    在JavaScript中,类式继承是一种实现面向对象编程的方式,它基于原型链机制。在JavaScript中,每个函数都可以作为构造函数创建实例,同时每个对象都有一个`__proto__`属性(在ES5及以下版本)或`[[Prototype]]`内部...

    浅析javascript原型继承机制

    在JavaScript中,并没有直接提供类的概念,而是通过原型来实现继承。本文将深入探讨JavaScript中的原型继承机制,帮助读者理解其中的关键概念及其工作原理。 #### 二、原型与构造函数 在JavaScript中,每个函数都...

    js模拟类继承小例子

    在JavaScript中,由于其语言特性,没有内置的类继承机制,但可以通过各种方式模拟实现。本例中使用的是“原型链”(Prototype Chain)的方式来模拟类继承,这是一种常见的面向对象编程技巧。下面将详细解释这个例子...

    JavaScript 继承详解(三)

    在JavaScript编程中,继承是面向对象编程的核心概念之一,它允许开发者构建出层级化的对象结构。在JavaScript中实现继承有多种方法,其中构造函数和原型链的方式是较为传统的一种,但在实际应用中存在一些问题和陷阱...

    JavaScript类继承及实例化的方法

    JavaScript是一种基于原型的编程语言,它允许我们通过原型链来实现类的继承机制。在JavaScript中,并没有传统意义上类的定义,而是通过函数或者对象来模拟类的行为,这使得JavaScript的继承和实例化机制与其他面向...

    js继承

    JavaScript(简称JS)是一种广泛应用于Web开发的轻量级脚本语言,它的继承机制是其面向对象编程的重要组成部分。在JavaScript中,继承允许一个对象(子类)获取另一个对象(父类)的属性和方法,从而实现代码复用和...

    javascript继承的六大模式小结

    本文将深入探讨JavaScript继承的六大模式:原型链、借用构造函数、组合继承、原型式继承、寄生式继承以及寄生组合式继承。 1. **原型链** 原型链是JavaScript中最基础的继承方式,通过原型对象的引用实现。每个...

    再论Javascript的类继承

    总体而言,文章对JavaScript类继承中常见的问题进行了分析,并给出了相应的解决方案。这些解决方案涉及到继承的实现细节,如如何正确地传递构造函数参数、如何复制方法、如何处理constructor属性指向问题等。这些...

Global site tag (gtag.js) - Google Analytics