除了前面学习的三种继承外,还有另外三种:
原型继承
寄生继承,
寄生组合继承
都是以:
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. JSOI2008 火星人prefix

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2918  Solved: 866[Submit][ ...

  2. 微软开放技术开发了适用于 Windows Azure 移动服务的开源 Android SDK

     发布于 2014-02-10 作者 陈 忠岳 为进一步实现连接微软与非微软技术的目标,微软开放技术有限公司开发了适用于 Windows Azure 移动服务的 Android SDK,由Scot ...

  3. Android4.0 -- UI控件之 Menu 菜单的的使用(一)

      这一讲开始我们来讲一下Android中菜单的使用方法,菜单是应用中的普通的组件,主要是提供友好和专注的用户体验,你可以在你的Activity中使用 Menu APIs 来提供用户动作和其他选项的操 ...

  4. input hidden用法

    之前获取数据传数据,都是写在全局变量里,今天老板告诉我说用input hidden来存,我百度了一下,确实是个好方法,记录之: 1 隐藏域在页面中对于用户是不可见的,在表单中插入隐藏域的目的在于收集或 ...

  5. Good Numbers

    Problem Description If we sum up every digit of a number and the result can be exactly divided by 10 ...

  6. 使用aespython进行ECB加解密示例

    CBC示例: from aespython import cbc_mode, key_expander, aes_cipher key = 'MluJMEZegVmrnWDaBiG1j7lqpkxNH ...

  7. usaco 土地并购 && hdu 玩具装箱

    土地并购: Description 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些土地中最大的长乘以最大 ...

  8. BigInteger Uva

    import java.io.*; import java.math.BigInteger; import java.util.*; public class Main { public static ...

  9. hdoj 3785 寻找大富翁【优先队列+sort排序】

    寻找大富翁 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  10. 手机终于能连接android studio

    折腾了三天,终于能连上了,网上各种方法都试了,就是不行,结果安装了腾迅安全管家,自动安装了手机驱动就好了,原来一直都是驱动惹的祸啊......