//待研究

//类式继承
//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面向对象--类式继承的更多相关文章

  1. JS面向对象组件 -- 继承的其他方式(类式继承、原型继承)

    继承的其他形式: •类式继承:利用构造函数(类)继承的方式 •原型继承:借助原型来实现对象继承对象   类 : JS是没有类的概念的 , 把JS中的构造函数看做的类 要做属性和方法继承的时候,要分开继 ...

  2. JS原型继承和类式继承

    前言 一个多月前,卤煮读了一篇翻译过来的外国人写的技术博客.此君在博客中将js中的类(构造)继承和原型继承做了一些比较,并且得出了结论:建议诸位在开发是用原型继承.文中提到了各种原型继承的优点,详细的 ...

  3. js原生设计模式——2面向对象编程之继承—原型继承(类式继承的封装)

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  4. js原生设计模式——2面向对象编程之继承—new类式继承

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  5. js原生继承之——类式继承实例(推荐使用)

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  6. 精读JavaScript模式(八),JS类式继承

    一.前言 这篇开始主要介绍代码复用模式(原书中的第六章),任何一位有理想的开发者都不愿意将同样的逻辑代码重写多次,复用也是提升自己开发能力中重要的一环,所以本篇也将从“继承”开始,聊聊开发中的各种代码 ...

  7. js类式继承模式学习心得

    最近在学习<JavaScript模式>,感觉里面的5种继承模式写的很好,值得和大家分享. 类式继承模式#1--原型继承 方法 让子函数的原型来继承父函数实例出来的对象 <script ...

  8. JavaScript 类式继承与原型继承

    交叉着写Java和Javascript都有2年多了,今天来总结下自己所了解的Javascript类与继承. Javascript本身没有类似Java的面向对象的类与继承术语,但其基于原型对象的思想却可 ...

  9. JavaScript中的类式继承和原型式继承

    最近在看<JavaScript设计模式>这本书,虽然内容比较晦涩,但是细品才发现此书内容的强大.刚看完第四章--继承,来做下笔记. 书中介绍了三种继承方式,类式继承.原型式继承和掺元类继承 ...

随机推荐

  1. oracle常见sql积累

    select lower('HELLO') from dual;select lpad(100, 5, '*') from dual;select sysdate + 1 / 24 from dual ...

  2. jQuery折叠风琴

    这个效果用jQuery做是很方便的,根本不需要搞得很复杂. 网上有些效果DEMO不仅用了jQuery还引用一两个封装文件,真是匪夷所思. 最初想到了toggle: jQuery(document).r ...

  3. Squares<哈希>

    Description A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-d ...

  4. H3C S5000和H3C S5500,俺来罗

    S5开头,后面第二位数0-4搂二层交换机.5-9的为三层交换机. 小常识.

  5. JPA概要

    1 JPA概述 JPA(Java Persistence API,Java持久化API),定义了对象-关系映射(ORM)以及实体对象持久化的标准接口. JPA是JSR-220(EJB3.0)规范的一部 ...

  6. 离奇“undefined reference”错误分析与解决方案

    离奇“undefined reference”错误分析与解决方案 “undefined reference to XXX”是一类挺常见的链接错误,原因通常是链接时找不到声明成extern类型的函数的定 ...

  7. 【转】JAVA程序中Float和Double精度丢失问题

    原文网址:http://blog.sina.com.cn/s/blog_827d041701017ctm.html 问题提出:12.0f-11.9f=0.10000038,"减不尽" ...

  8. legoblock秀上限

    很久没有做题了,前天做了一道题结果弱的一逼...搜了解题报告不说...还尼玛秀了上限 题意: 给出宽和高为n和m的一堵墙,手上有长为1,2,3,4高均为1的砖,问形成一个坚固的墙有多少种做法. 坚固的 ...

  9. denyhost

    1. denyhost 简介及ssh安全 对外提供的服务器,每天都会被恶意扫描,试图暴力穷举密码,达到入侵的目的.从而控***务器,占用资源.网页挂马.垃圾广告.更会影响我们业务的正常使用和数据的安全 ...

  10. Apache-Tika解析Excell文档

    通常在使用爬虫时,爬取到网上的文章都是各式各样的格式处理起来比较麻烦,这里我们使用Apache-Tika来处理Excell格式的文章,如下: package com.mengyao.tika.app; ...