js面向对象--类式继承
//待研究 //类式继承
//js中模拟类式继承的3个函数
//简单的辅助函数,让你可以将新函数绑定到对象的 prototype 上
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(); //创建一个新的名为 'uber' 的"特权"函数,
//调用它时会执行所有在继承时被重写的函数
this.method('uber', function uber (name) {
var func; //要执行的函数
var ret; //函数的返回值
var v = parent.prototype; //父对象的 prototype
// 如果我们已经在某个'uber'函数之内
console.log(depth);
if (depth) {
//上溯必要的depth,以找到原始的 prototype
for (var i = 0; i < depth; i++) {
v = v.constructor.prototype;
} //从该 prototype 中获得函数
func = v[name]; //否则这就是 'uber' 函数的第一次调用
} else {
//从 prototype 获得要执行的函数
func = proto[name];
//如果此函数属于当前的 prototype
if ( func == this[name]) {
// 则改为调用父对象的 prototype
func = v[name];
}
} //记录我们在继承堆栈中所在位置的级数
depth += 1; //使用除第一个以外所有的 arguments 调用此函数
//(因为第一个参数是执行的函数名)
ret = func.apply(this, Array.prototype.slice.apply(arguments,[1])); //恢复继承堆栈
depth -= 1;
//返回执行过的函数的返回值
return ret;
}); return this; }); //只继承父对象特定函数的函数. 而非使用 new parent() 继承所有的函数
Function.method('swiss',function (parent) {
//遍历所有要继承的方法
for (var i = 0; i < arguments.length; i++) {
//需要导入的方法名
var name = arguments[i]; //将此方法导入 this 对象的 prototype 中
this.prototype[name] = parent.prototype[name];
} return this;
}); //创建一个新的 Person 对象构造函数
function Person ( name ) {
this.name = name;
} //给 Person 对象添加一个新方法
Person.method('getName',function(){
return this.name;
}); //创建一个新的 User 对象构造函数
function User ( name,password ) {
this.name = name;
this.password = password;
} //从 Person 对象继承所有方法
User.inherits( Person ); //给User对象添加一个新的方法
User.method('getPassword',function () {
return this.password;
}); //覆盖 Person 对象创建的 getName 方法,但通过 uber 函数来调用原有方法
User.method('getName',function () {
return "User|| " + this.uber('getName');
});
var user=new User();
function UUser( name,password,age ) {
this.name = name;
this.password = password;
this.age = age;
}
UUser.inherits( User );
UUser.method('getAge',function () {
return this.age;
});
UUser.method('getName',function () {
return "UUser||" + this.uber('getName');
}); var user2=new UUser( 'xiaohong','pass',50 );
console.log(user2.getName()); //UUser||User|| xiaohong
js面向对象--类式继承的更多相关文章
- JS面向对象组件 -- 继承的其他方式(类式继承、原型继承)
继承的其他形式: •类式继承:利用构造函数(类)继承的方式 •原型继承:借助原型来实现对象继承对象 类 : JS是没有类的概念的 , 把JS中的构造函数看做的类 要做属性和方法继承的时候,要分开继 ...
- JS原型继承和类式继承
前言 一个多月前,卤煮读了一篇翻译过来的外国人写的技术博客.此君在博客中将js中的类(构造)继承和原型继承做了一些比较,并且得出了结论:建议诸位在开发是用原型继承.文中提到了各种原型继承的优点,详细的 ...
- js原生设计模式——2面向对象编程之继承—原型继承(类式继承的封装)
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- js原生设计模式——2面向对象编程之继承—new类式继承
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- js原生继承之——类式继承实例(推荐使用)
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 精读JavaScript模式(八),JS类式继承
一.前言 这篇开始主要介绍代码复用模式(原书中的第六章),任何一位有理想的开发者都不愿意将同样的逻辑代码重写多次,复用也是提升自己开发能力中重要的一环,所以本篇也将从“继承”开始,聊聊开发中的各种代码 ...
- js类式继承模式学习心得
最近在学习<JavaScript模式>,感觉里面的5种继承模式写的很好,值得和大家分享. 类式继承模式#1--原型继承 方法 让子函数的原型来继承父函数实例出来的对象 <script ...
- JavaScript 类式继承与原型继承
交叉着写Java和Javascript都有2年多了,今天来总结下自己所了解的Javascript类与继承. Javascript本身没有类似Java的面向对象的类与继承术语,但其基于原型对象的思想却可 ...
- JavaScript中的类式继承和原型式继承
最近在看<JavaScript设计模式>这本书,虽然内容比较晦涩,但是细品才发现此书内容的强大.刚看完第四章--继承,来做下笔记. 书中介绍了三种继承方式,类式继承.原型式继承和掺元类继承 ...
随机推荐
- Josephus2
约瑟夫问题升级问题 编号为1~N的N个人按顺时针方向围坐一圈,每个人持有一个密码(正整数,可以自由输入),开始人选一个正整数作为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报道M是停止报数. ...
- Linux——搭建PHP开发环境第三步:mysql
原文链接:http://www.jb51.net/article/83647.htm 1.第一步就是看linu是否安装了mysql,经过rpm -qa|grep mysql查看到centos下安装了m ...
- Ruby自学笔记(六)— 循环
循环结构在编程语言中是不可或缺的,所以Ruby中的循环也有其自定义的规则. 而我们关注循环结构,要知道两个因素:1) 循环的条件:2) 循环执行的内容 Ruby有一些方式来实现循环结构体: 1. ti ...
- [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】
题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...
- [BZOJ 3626] [LNOI2014] LCA 【树链剖分 + 离线 + 差分询问】
题目链接: BZOJ - 3626 题目分析 考虑这样的等价问题,如果我们把一个点 x 到 Root 的路径上每个点的权值赋为 1 ,其余点的权值为 0,那么从 LCA(x, y) 的 Depth 就 ...
- [BZOJ 3110] [Zjoi2013] K大数查询 【树套树】
题目链接: BZOJ - 3110 题目分析 这道题是一道树套树的典型题目,我们使用线段树套线段树,一层是区间线段树,一层是权值线段树.一般的思路是外层用区间线段树,内层用权值线段树,但是这样貌似会很 ...
- 全是干货---Linux 高可用(HA)集群基本概念详解
http://www.linuxidc.com/Linux/2013-08/88522.htm 高可用集群的衡量标准 HA(High Available), 高可用性群集是通过系统的可靠性(re ...
- ArrayList的toArray
ArrayList提供了一个将List转为数组的一个非常方便的方法toArray.toArray有两个重载的方法: 1.list.toArray(); 2.list.toArray(T[] a); ...
- MySql的大小写问题
原来Linux下的MySQL默认是区分表名大小写的,通过如下设置,可以让MySQL不区分表名大小写:1.用root登录,修改 /etc/my.cnf:2.在[mysqld]节点下,加入一行: lowe ...
- mysql处理字符串的两个绝招:substring_index,concat
mysql处理字符串的两个绝招:substring_index,concat 最近老是碰到要处理数据库中字符串的处理,发现用来用去也就是这两个函数: 1.substring_index(str,del ...