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设计模式>这本书,虽然内容比较晦涩,但是细品才发现此书内容的强大.刚看完第四章--继承,来做下笔记. 书中介绍了三种继承方式,类式继承.原型式继承和掺元类继承 ...
随机推荐
- iscc2016-basic-find-to-me
额 第一题就暴力搜索了 已知仿射加密变换为c=(11m+8)mod26,试对密文sjoyuxzr解密 #include <stdio.h> int main(void) { int m,c ...
- Web.config总结
%windir%/Microsoft.NET/Framework/v2.0.50727/CONFIG目录下machine.config定义了针对当前机器的WinForm程序和asp.net应用程序的配 ...
- ASP.NET页面不被缓存
设置ASP.NET页面不被缓存分类:ASP.NET (3531) (1) /// <summary> /// 设置页面不被缓存 /// </summa ...
- CH Round #48 - Streaming #3 (NOIP模拟赛Day1)
A.数三角形 题目:http://www.contesthunter.org/contest/CH%20Round%20%2348%20-%20Streaming%20%233%20(NOIP模拟赛D ...
- supesite 相关 修改
1.修改 站点名称及logo http://faq.comsenz.com/viewnews-594 2.supesite 如何 收录论坛 http://faq.comsenz.com/viewnew ...
- bzoj 3876 [Ahoi2014]支线剧情(有上下界的最小费用流)
3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 484 Solved: 296[Submit][Status ...
- Girls' research - HDU 3294 (Manacher处理回文串)
题目大意:给以一个字符串,求出来这个字符串的最长回文串,不过这个字符串不是原串,而是转换过的,转换的原则就是先给一个字符 例如 'b' 意思就是字符把字符b转换成字符 a,那么c->b, d-& ...
- Java中的 修饰符
java中的修饰符分为类修饰符,字段修饰符,方法修饰符. 根据功能的不同,主要分为以下几种. 1.权限访问修饰符 访问权限的控制常被称为具体实现的隐藏 把数据和方法包进类中,以及具体实现的隐藏,常共 ...
- Cocos2d-iphone 为sprite添加双击的事件响应
这篇文章介绍两种方式处理cocos2d中的双击事件响应. 在iOS中使用UITapGestureRecognizer ,很容易就可以添加双击事件处理,但是在cocos2d中无法直接向sprite添加U ...
- C#中常用接口介绍
1. IComparable接口 IComparable接口定义通用的比较方法.由类型使用的IComparable接口提供了一种比较多个对象的标准方式.如果一个类要实现与其它对象的比较, 则必须实现I ...