/**
*
* 用于类继承
* 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中对类的定义、继承、封装机制,主要功能特征包括: 一、 统一了类定义的语法...
我今天做的尝试是,如何更它更像其他的语言一样的使用继承机制,多层继承和更方面的调用父类的构造。 我希望达到的效果: 代码如下: function A(){ alert(‘a’); } function B(){ this.$supClass(); alert&...
因为我对大多数人在 JavaScript 中处理继承的方式不满意。 通常,人们尝试传递单个Object.create()作为继承的可行解决方案。 不幸的是,当您想要多重继承或在您的类中调用“超级构造函数”的能力时,这往往会失败。...
JS继承测试项目描述一个简单的测试项目,可以尝试javascript继承。执照(麻省理工学院执照) 版权所有(c)2009 Gewalli <gewalli> 特此免费授予获得此软件和相关文档文件(“软件”)副本的任何人无限制地处理软件...
我一直很难理解Javascript语言的继承机制。 它没有”子类”和”父类”的概念,也没有”类”(class)和”实例”(instance)的区分,全靠一种很奇特的”原型链”(prototype chain)模式,来实现继承。 我花了很...
它不会破坏instanceof并且使用 Concur 创建的构造函数不会是instanceof Concur - 它不会尝试将其他语言的范式移植到 JavaScript 中,但它确实尝试提供一种在设置继承时操作原型的便捷方法。 假设标准的inherits...
探索JavaScript继承的本质 2.1构造函数之间的“复制粘贴” 第一条路是通过构造函数来继承,这可以理解为子类直接复制了父类构造函数的代码,然后按照一定的规矩“粘贴”在自己的构造函数中,为己所用。举个例子: ...
2015年8月11日更新Anthony Alicea的有关UDEMY的JS怪异课程确实使我对javascript的一些优点感到惊讶。 它教会了我有关函数式编程和继承以及其他所有方面的知识! 我将继续练习编码,然后回到他的课程进行完善。 目前...
f) 继承:只是在查询一个属性时自动发生,而不会在写属性时发生,就是说单写一个父类的属性时,JavaScript环境会为对象本身创建一个同名的属性,从此该属性就覆盖了父类中的属性。 12) 创建一个数组可用 new Array()...
这项作业的目的是了解javascript中的继承。脚步查看shape.js,square.js,rectangle.js的源文件。 shape.js文件将具有所有需要实现的功能。 还没写代码! 首先编写测试。 进行形状,正方形和矩形的测试。 编写完...
js-interface介绍在做一个前后分离的项目时,有些头疼 Api 之类的东西要怎么管理,在阅读 一书时,第二章提到了在 JavaScript 中模拟接口 (interface) 的概念,以方便使用众多设计模式,因此尝试着做一个接口的模拟...
基础知识html css js dom bomdiv p h1-h6 img span ul dl ol li 等JS 基础语法知识ES6 JSX React Redux Webpackhtml+css+js 实战JS 知识点记录`多行字符串 ES6 JS对象由键值对组成。delete obj.proName ; ...
」, 刚看到这个问题时,直接就想到了继承行为在 javascript 中的表现。后面作者的一句话「super 不可以省略,省略的话会报错」。当时脑海中蹦出来一个念头,这个同学是不是写错了,super 不就是用来完成调用父类构造...
不久前,根据原始文件上的时间戳,2008 年左右,我正在阅读有关原型继承的内容,并认为我会尝试一下。 一段时间以来,我也一直想尝试制作一款视频游戏。 我喜欢俄罗斯方块,所以它看起来和任何起点一样好。 我花了一...
Godot游戏引擎JavaScript语言绑定该模块为godot游戏引擎实现了JavaScript / TypeScript语言支持。 用作ECMAScript引擎。...)用法如何将脚本类导出到godot 定义您的ECMAScript类并从godot类继承,然后将
我在2015年秋天(在大学一年级的时候)使用该存储库尝试了一些自定义类型,这些类型将帮助我为基于画布的应用程序设计GUI。 因此,我使用了JavaScript。 实验的结果将主要帮助我从事百万富翁或百万富翁-海绵宝宝版...
为什么要使用CrossJS样式指南? 采用CrossJS风格意味着您的javascript可以在任何环境中工作而无需依赖任何核心浏览器/节点js ... 我还建议您尝试并执行性能测试。 如果您遵循此规则,则可能只用很少一部分就可以编写
这项作业的目的是了解javascript中的继承。 脚步 查看shape.js,square.js,rectangle.js的源文件。 shape.js文件将具有所有需要实现的功能。 还没写代码! 首先编写测试。 进行形状,正方形和矩形的测试。 编写...
最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事。最快的车被称为 Le Mans 原型车。这些车虽然是由“奥迪”或“标致”这些厂商制造的,可它们并不是你在街上或速公路上所见到的那类汽车。它们是专...