JavaScript一个类继承中实现
JavaScript类是默认原型对象继承:
var Person = function() {
this.name = "people";
this.hello = function() {
console.log("hello user:" + this.name);
}
}
var User = function() {
this.name = "user";
this.hello = function() {
User.prototype.hello.call(this, arguments);
console.log("hello user:" + this.name);
}
}
User.prototype = new Person();
new User().hello();
有没有一种方法。可以让JavaScript的类像Java那样,通过一个superkeyword即调用父类的方法,于是我这样扩展了Function:
(function() {
Function.prototype.extend = function(baseClass) {
// this is a function object.
var oldPrototype = this.prototype, newPrototype = {}, _super = new baseClass();
//inherits all properties and methods.
for ( var name in _super) {
newPrototype[name] = _super[name];
}
for ( var name in oldPrototype) {
// only override properties in this new Class.
if (oldPrototype.hasOwnProperty(name)) {
// only function need _super.
if (typeof oldPrototype[name] == "function" && typeof _super[name] == "function") {
newPrototype[name] = (function(name, fn) {
return function() {
var tmp = this._super;
// set super method
this._super = _super[name];
var ret = fn.apply(this, arguments);
this._super = tmp;
return ret;
};
})(name, oldPrototype[name]);
}
}
}
this.prototype = newPrototype;
return this;
};
})();
測试代码
var A = function() {
this.hello = function() {
console.log("hello, I'm A");
}
};
var B = function() {};
B.prototype = {
hello : function() {
this._super();
console.log("hello, I'm B");
}
};
B.extend(A);
var C = function() {};
C.prototype = {
hello : function() {
this._super();
console.log("hello, I'm C");
}
};
C.extend(B);
var b = new B();
var c = new C();
//b.hello();
c.hello();
结果
hello, I'm A
hello, I'm B
hello, I'm C
版权声明:本文博客原创文章。博客,未经同意,不得转载。
JavaScript一个类继承中实现的更多相关文章
- C++ //多继承语法 C++中允许一个类继承多个类
1 //多继承语法 C++中允许一个类继承多个类 2 #include <iostream> 3 #include <string> 4 using namespace std ...
- C++类继承中的构造函数和析构函数 调用顺序
思想: 在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承) 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时, ...
- (C++)C++类继承中的构造函数和析构函数
思想: 在C++的类继承中, 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时,其顺序正好与构造相反: 例子: #include <iostream& ...
- C++ 类的继承四(类继承中的重名成员)
//类继承中的重名成员 #include<iostream> using namespace std; /* 自己猜想: 对于子类中的与父类重名的成员,c++编译器会单独为子类的这个成员变 ...
- java一个类 继承HttpServlet 和实现Servlet区别
java一个类 继承HttpServlet 和实现Servlet区别 servlet 是一个接口,如果实现这个接口,那么就必须实现接口里面定义的所有方法 而HttpServlet实现了servlet接 ...
- C# 类继承中的私有字段都去了哪里?
最近在看 C++ 类继承中的字段内存布局,我就很好奇 C# 中的继承链那些 private 字段都哪里去了? 在内存中是如何布局的,毕竟在子类中是无法访问的. 一:举例说明 为了方便讲述,先上一个例子 ...
- C++ 类的继承五(类继承中的static关键字)
//类继承中的static关键字 #include<iostream> using namespace std; /* 派生类中的静态成员 基类定义的静态成员,将被所有派生类共享 根据静态 ...
- C# 类型运算符重载在类继承中的调用测试
这是一篇晦涩难懂的片面的研究 一,简单的继承层次 class CA { } class CB : CA{ } class CC : CB{ } } void Test(CA oa){//CATest ...
- C++基础——类继承中方法重载
一.前言 在上一篇C++基础博文中讨论了C++最基本的代码重用特性——类继承,派生类可以在继承基类元素的同时,添加新的成员和方法.但是没有考虑一种情况:派生类继承下来的方法的实现细节并不一定适合派生类 ...
随机推荐
- Behavioral模式之Observer模式
1.意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,全部依赖于它的对象都得到通知并被自己主动更新. 2.别名 依赖(dependents).公布-订阅(Publish-Subscr ...
- Python 相机镜头
一哥第一卷感叹,这家奥地利~.这是什么g8事件,近盲目安装3g的OpenCV,结果徒劳. . . 入题.!环境Python2.7 严厉格按照什么步骤.必成功: 所需的软件如下面: VideoCaptu ...
- extjs_03_grid(添加数据)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- hibernate几个纯sql查询
几个hibernate纯SQL询问,查询和表没有映射pojo实体和表有映射关系的实体...... 1.getSession().createSQLQuery(sql).query.addScalar( ...
- HOWTO: 为GitHub for Windows指定代理服务器(转)
If the command line way of configuring your proxy server doesn't work, you can probably just edit .g ...
- Oracle查询速度慢的原因总结
Oracle查询速度慢的原因总结 查询速度慢的原因很多,常见如下几种:1,没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)2,I/O吞吐量小,形成了瓶颈效应.3,没有创建计算列导致 ...
- C#从SQL server数据库中读取l图片和存入图片
原文:C#从SQL server数据库中读取l图片和存入图片 本实例主要介绍如何将图片存入数据库.将图片存入数据库,首先要在数据库中建立一张表,将存储图片的字段类型设为Image类型,用FileStr ...
- CodeIgniter连接数据库及快速入门
原文:CodeIgniter连接数据库及快速入门 一.数据库配置 CodeIgniter 有一个配置文件让你存放数据库连接值(username:用户名,password:密码,database nam ...
- ASPxComboBox控件联动效果bug改进
原文:ASPxComboBox控件联动效果bug改进 在应用第三方控件DevExpress控件的时候,大家应该对ASPxComboBox控件应该不是很陌生吧,尤其在做多级联动效果的时候,有着它独特的地 ...
- android开源系列:CircleImageView采用圆形控制它们的定义
1.定义自己的圆形控制github住址:https://github.com/hdodenhof/CircleImageView 基本的类: package de.hdodenhof.circleim ...