除了前面学习的三种继承外,还有另外三种:
原型继承
寄生继承,
寄生组合继承
都是以:
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. BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec   ...

  2. team geek

    1. 转载自http://book.douban.com/review/6007037/,版权归丸子(^.^)v所有. New Google employees (we call “Nooglers” ...

  3. Semi-definite programming优化工具

    半正定优化工具(SDPLR) SDPLR 是一个求解大规模半正定规划问题的C语言包.具体使用方法参见: http://dollar.biz.uiowa.edu/~sburer/pmwiki/pmwik ...

  4. Jsp_demo:自定义标签

    Jsp自定义标签: 1.继承SimpleTagSupport,重写doTag(). 2.在WEB-INF/ 下配置**.tld文件 3.Jsp页面引入自定义标签:<%@ taglib uri=& ...

  5. 1 weekend110的NN元数据管理机制 + NN工作机制 + DN工作原理

    第一天的笔记,是伪分布hadoop集群搭建, 后面是hadoop Ha的分布式集群搭建 第一天,是HDFS的shell操作 NN工作机制 里面是二进制 DN工作原理 上传完了之后,在hdfs的虚拟路径 ...

  6. DrawerLayout和toolbar的使用

    onPostCreate()是Activity完全启动后的调用:在完全启动后的回调设置toolbar 然后在使用 AppCompatActivity 时style要设置为何appCompat相关的样式 ...

  7. RestService中的 get post put delete

    HTTP 定义了与服务器交互的不同方法,最基本的有四种方法:GET,POST,PUT,DELETE.URL即资源描述符,我们可以这样认为:一个URL地址, 用于描述一个网络上的资源,而HTTP中的GE ...

  8. LINUX下mysql的大小写是否区分设置 转

    一.Linux中MySQL大小写详情:1.数据库名严格区分大小写2.表名严格区分大小写的3.表的别名严格区分大小写4.变量名严格区分大小写5.列名在所有的情况下均忽略大小写6.列的别名在所有的情况下均 ...

  9. python编写Mysql自动备份脚本

    1、先写一个python脚本 vim /opt/mysql_dump.py #!/usr/bin/env python# -*- coding:utf-8 -*-import osimport tim ...

  10. WPF textbox 圆角制作

    在app.xaml中加入以下节点,全局设置textbox圆角 <Style TargetType="{x:Type TextBox}">            < ...