/**
*
* 用于类继承
* 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的开发,痛彻体会javascript面向对象编程的不便性,精心制作了一个类的定义与继承功能的js,实现了在javascript中对类的定义、继承、封装机制,主要功能特征包括: 一、 统一了类定义的语法...
### JavaScript中的继承——类继承 #### 一、引言 JavaScript是一种动态的、弱类型的编程语言,它支持面向对象编程模式。与传统的面向对象语言如Java或C#不同,JavaScript的继承模型基于原型,这使得它的继承机制...
根据提供的文件信息,我们可以分析并总结出关于JavaScript继承的一些关键知识点。尽管提供的代码示例主要关注于使用jQuery插件初始化一个表格(grid),但这里我们将重点放在如何在JavaScript中实现继承这一主题上。...
JavaScript(JS)是一种广泛用于网页和网络应用的脚本语言,尤其在前端开发中起着核心作用。在JS中,对象的继承是实现代码复用和构建复杂应用程序的关键机制。继承允许一个对象(子对象)从另一个对象(父对象或基...
### JavaScript继承实现示例 #### 知识点概述 在JavaScript中,继承是一种常见的对象间关系,它允许一个对象(子类)继承另一个对象(父类或超类)的属性和方法。通过继承,可以复用代码、提高程序的可维护性,并...
JavaScript中的继承机制是实现代码复用和面向对象编程的关键特性。本文主要探讨了两种常见的继承方式:原型链继承和类式继承。 1. **原型链继承**: 原型链继承是JavaScript中实现继承的基本方式,它依赖于原型(`...
本篇文章将深入探讨JavaScript继承的实例,以及如何通过继承来提高代码的可维护性和效率。 首先,我们需要了解JavaScript中的原型(prototype)机制。每个JavaScript对象都有一个内部属性[[Prototype]],通常通过`_...
在学习过程中,实践是关键,尝试创建自己的类,实现继承关系,使用不同包中的类,你将对这些概念有更深入的理解。同时,不断探索和学习新的编程技术,保持对编程的热情,将有助于你在IT行业中取得成功。
1. **JavaScript继承** - **原理**:JavaScript的继承主要是通过原型链(prototype chain)来实现的。每个JavaScript对象都有一个内部属性[[Prototype]],通常可以通过`__proto__`访问,或通过`Object....
### 理解Javascript原型继承原理 #### 一、引言 在JavaScript中,原型继承是一种非常核心且独特的机制,它使得对象能够继承其他对象的属性和方法。本文旨在深入探讨这一机制,并通过具体的示例代码帮助读者更好地...
JavaScript中的继承是面向对象编程的重要概念,它允许创建新的对象类,这些类可以从现有类继承属性和方法。本文将深入探讨JavaScript中常见的两种继承实现方式:`prototype`方式和`apply`方式,并分析它们的优缺点。...
在JavaScript中,类式继承是一种实现面向对象编程的方式,它基于原型链机制。在JavaScript中,每个函数都可以作为构造函数创建实例,同时每个对象都有一个`__proto__`属性(在ES5及以下版本)或`[[Prototype]]`内部...
在JavaScript中,并没有直接提供类的概念,而是通过原型来实现继承。本文将深入探讨JavaScript中的原型继承机制,帮助读者理解其中的关键概念及其工作原理。 #### 二、原型与构造函数 在JavaScript中,每个函数都...
在JavaScript中,由于其语言特性,没有内置的类继承机制,但可以通过各种方式模拟实现。本例中使用的是“原型链”(Prototype Chain)的方式来模拟类继承,这是一种常见的面向对象编程技巧。下面将详细解释这个例子...
在JavaScript编程中,继承是面向对象编程的核心概念之一,它允许开发者构建出层级化的对象结构。在JavaScript中实现继承有多种方法,其中构造函数和原型链的方式是较为传统的一种,但在实际应用中存在一些问题和陷阱...
JavaScript是一种基于原型的编程语言,它允许我们通过原型链来实现类的继承机制。在JavaScript中,并没有传统意义上类的定义,而是通过函数或者对象来模拟类的行为,这使得JavaScript的继承和实例化机制与其他面向...
JavaScript(简称JS)是一种广泛应用于Web开发的轻量级脚本语言,它的继承机制是其面向对象编程的重要组成部分。在JavaScript中,继承允许一个对象(子类)获取另一个对象(父类)的属性和方法,从而实现代码复用和...
本文将深入探讨JavaScript继承的六大模式:原型链、借用构造函数、组合继承、原型式继承、寄生式继承以及寄生组合式继承。 1. **原型链** 原型链是JavaScript中最基础的继承方式,通过原型对象的引用实现。每个...
总体而言,文章对JavaScript类继承中常见的问题进行了分析,并给出了相应的解决方案。这些解决方案涉及到继承的实现细节,如如何正确地传递构造函数参数、如何复制方法、如何处理constructor属性指向问题等。这些...