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设计模式>这本书,虽然内容比较晦涩,但是细品才发现此书内容的强大.刚看完第四章--继承,来做下笔记. 书中介绍了三种继承方式,类式继承.原型式继承和掺元类继承 ...
随机推荐
- CentOS下命令行和桌面模式的切换方法(转载)
桌面模式和命令行模式的切换方法 用编辑器打开 /etc/inittab 文件(这里用的是vi,你可以选择你喜欢的): #vi /etc/inittab 打开效果图如下: 桌面模式 : 把光标所在 ...
- vs 2015 菜单重复的问题解决方法
打开 “运行” 输入 D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe /resetuserdata ...
- Oracle数据库基础知识_字符串操作相关2
6.LPAD,RPAD 作用:左/右边的字符串填充一些特定的字符语法: LPAD(string , n, [pad_String]) string:可是字符或者参数 ...
- 单例-b
这个比较老了,是mrc 里面的 此例以模仿Apple官方文档的单例写出来的.但是一直有一个非常不明白的地方,就是alloc与allocWithZone:的重载中,为什么要return [[self c ...
- Java吸收换行符
今天做题遇到的-- 由于读入的字符串可能包含空格,所以采用nextLine. int n = sc.nextInt(); for(int i=0; i<n; i+ ...
- Django 1.6 的测试驱动开发
http://www.oschina.net/translate/django-1-6-test-driven-development 测试驱动开发(TDD)是一个迭代的开发周期,强调编写实际代码之前 ...
- Rundeck,RUN起来!!
零晨一点, 还好,跑起来了.. 满满的英文文档,肿么办?? 拿下!
- android如何获取默认的桌面程序
[方法1] http://stackoverflow.com/questions/12594192/remove-activity-as-default-launcher/12594332#12594 ...
- Java Random
第一种情况 Random rand = new Random(47); for(int i=0;i<10;i++) System.out.println(rand.nextInt(100)); ...
- .net线程入门1-进程
什么是进程 当用户启动了一个程序,这个程序会加载内存和一大堆的资源,这些内存和资源在物理上的分区就是一个进程.一个应用程序也许不仅仅包含一个进程,了解程序和进程不是同一回事是非常重要的. 你可以通过任 ...