除了前面学习的三种继承外,还有另外三种:
原型继承
寄生继承,
寄生组合继承
都是以:
function object(o) {
function F() { }
F.prototype = o;
return new F();
}
为基础:
先定义的F(),相当于模板类,接着它的原型对象被指向了传入的参数o,F具有了o的属性和方法(作为原型属性和方法)最后返回一个模板类实例

var person = { name: 'ads', friends: ['sds1', 'sds2'] };
var other = object(person);
other.showName = function () { return this.name; }
other.showFriends = function () { return this.friends; }
other.name = 'sds3';
other.friends.push('sds4');
alert(other.showName());
alert(other.showFriends());
//other对象的原型是person,即name friends属性是other的原型对象上的属性,
//对它们的改变都影响到其他对象(从person继承的,甚至Person自己)
alert(person.name);
alert(person.friends);
//原型属性的改变将影响其他对象,寄生继承可以看做是对原型继承的增强,它在object()基础上提供了create()

寄生继承的核心代码

function inherit(childType,baseType){//childType:子类构造器,baseType:基类构造器
    var proto = object(baseType.prototype);//基于基类原型对象创建一个对象,将作为子类原型对象
    proto.constructor = childType;//指定新原型对象的构造器属性为子类构造器
    childType.prototype = proto;//子类原型属性指向新的原型对象
}

//create()的用意很明确,相对于object()来说,新对象通过原型继承了o的属性和方法,再定义新对象自己的属性和方法
function inherit(childType,baseType) {//childType:子类构造器,baseType:基类构造器
var proto = object(baseType.prototype);//基于基类原型对象创建一个对象作为子类的原型对象
proto.constructor = childType;//指定新原型对象的构造器属性为子类构造器
childType.prototype = proto;//子类原型属性指向新的原型对象
}

function BaseClass(name) { this.name = name; this.colors = ['blue', 'red']; }
BaseClass.GetName = function () { this.name; }
function ChildClass(name, age) {
BaseClass.apply(this, [name]);
this.age = age;
}
inherit(ChildClass, BaseClass);
ChildClass.prototype.getAge = function () { return this.age; }
var obj = new ChildClass("sds", 50);
alert(obj.getAge());//sds
alert(obj.getAge());//50
alert(obj.colors);//red,blue;

注意:
对象的原型对象上的属性并不是对象自己的属性,但是对象可以通过.或者[]访问,in
操作符可以访问对象上所有能访问的属性和方法,而hasOwnProperty()方法只能检测
对象自身的属性和方法

var one = { 'name': 'ads', 'getName': function () { return this.name; } }
var two = object(one);

alert('name' in one);
alert('name' in two);

alert(two.hasOwnProperty('name'));

在对 two.name 赋值操作后,two对象自身会创建一个name属性,有别与two的原型对象上的name属性,从此对two.name的访问或者赋值都使用自身的name属性,与位于原型的name没关系

javascript类继承系列五(其他方式继承)的更多相关文章

  1. Javascript判断数据类型的五种方式及其特殊性

    Javascript判断数据类型的五种方式及区别 @ 目录 typeof instanceof Object.prototype.toString isArray iisNaN ----------- ...

  2. javascript类继承系列四(组合继承)

    原理: 结合了原型链和对象伪装各自优点的方式,基本思路是:使用原型链继承原型上的属性和方法,使用对象伪装继承实例属性,通过定义原型方法,允许函数复用,并运行每个实例拥有自己的属性 function B ...

  3. js实现继承的五种方式

    function Parent(firstname) { this.fname=firstname; ; this.sayAge=function() { console.log(this.age); ...

  4. javascript类的继承

    1.构造函数方式写类,通过方法调用复制父类属性/字段到子类 实现继承 这里父类,子类都采用构造函数方式写,不用原型.子类调用父类函数来复制父类的属性. 1 2 3 4 5 6 7 8 9 10 11 ...

  5. c/c++ 继承与多态 友元与继承

    问题1:类B是类A的友元类,类C是类B的友元类,那么类C是类A的友元类吗?函数fun是类B的友元函数,那么fun是类A的友元函数吗? 都不是,友元关系不能传递. 问题2:类B是类A的友元类,类C是类B ...

  6. How Javascript works (Javascript工作原理) (十五) 类和继承及 Babel 和 TypeScript 代码转换探秘

    个人总结:读完这篇文章需要15分钟,文章主要讲解了Babel和TypeScript的工作原理,(例如对es6 类的转换,是将原始es6代码转换为es5代码,这些代码中包含着类似于 _classCall ...

  7. 详谈Javascript类与继承

    本文将从以下几方面介绍类与继承 类的声明与实例化 如何实现继承 继承的几种方式 类的声明与实例化 类的声明一般有两种方式 //类的声明 var Animal = function () { this. ...

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

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

  9. javascript实现继承的几种方式

    原型链方式实现继承 function SuperType(){ this.property = true; this.colors = ['red','blue','green']; } SuperT ...

随机推荐

  1. Datetime中yyyy-MM-dd-hh-mm-ss的格式

    namespace yyyy_MM_dd_hh_mm{    class Program    {        static void Main(string[] args)        { wh ...

  2. 使用GDI+轻松创建缩略图

    Gdi+ 还是相当好用的. 1> Image保存图像,需要一个CLSID的参数,它可以这样获得: int   GetEncoderClsid(const   WCHAR*   format,   ...

  3. 通过 WIN32 API 实现嵌入程序窗体

    写了一个不使用 COM, 而是通过 WIN32 API 实现的示例, 它把写字板程序嵌在了自己的一个面板中. 这么做可能没有实际意义, 因为两个程序之前没有进行有价值的交互, 这里仅仅是为了演示这么做 ...

  4. BZOJ3156: 防御准备

    3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 442  Solved: 210[Submit][Status] Descript ...

  5. HTML5 Canvas 颜色填充学习

    ---恢复内容开始--- 如果我们想要给图形上色,有两个重要的属性可以做到:fillStyle 和 strokeStyle. fillStyle = color strokeStyle = color ...

  6. WordPress文件上传与下载问题解决

    网上流传了一些修改WordPress文件上传大小限制的做法,大部分是一个版本,而且说得不够准确,特别是对于生手的指导性不强,本文总结了使用Wordpress博客的朋友在文件上传与下载时大小限制,及文件 ...

  7. 微信小程序正式发布!这是最全的上手指南

    2017 年 1 月 9 日,是一个值得载入互联网史册的日子. 这一天,零点刚过,张小龙和他的团队,在夜色笼罩下,正式发布了微信小程序. 所以,从这一刻开始,只要有开发者登录小程序后台,并在「开发管理 ...

  8. Apache Commons 工具类

    http://blog.csdn.net/feicongcong/article/details/53374399http://blog.csdn.net/hsienhua/article/detai ...

  9. storm单机版安装配置

    1,install zeromq 期间可能出现:configure: error: cannot link with -luuid, install uuid-dev. 因此可以先安装 sudo ap ...

  10. .NET中ToString()的用法

    一.数字转换到字符串 格式说明符     说明       示例                         输出 C                 货币      2.5.ToString(& ...