js继承的关系多,而且拥有不同的特点。同时也是必须了解掌握的知识点。首先,要先知道什么是构造函数?

构造函数

构造函数和普通函数的区别:仅在于调用方式不同,任何函数,只要通过 new 操作符来调用,那它可以作为构造函数;任何函数,如果不通过 new 操作符有来调用,那么它是一个普通函数。

实例拥有 constructor(构造函数)属性,该属性返回创建实例对象的构造函数。注:除了基本类型的 constructor 外( null 和 undefined 无 constructor 属性),constructor 可以被重写的。因此检测对象类型时。instanceof 操作符比 constructor 更可靠。

function Person(name,age){
this.name=name;
this.age =age;
}
var Kaiser =new Person('kaiser',22) ;
console.log(Kaiser.constructor === Person); //true

  

原型

创建的每个函数都有 prototype 属性,这个属性指向函数的原型对象。原型对象的用途是包含可以有特定类型的所有实例共享的属性和方法。
默认情况下,所有原型对象都会自动获得一个 constructor 属性,这个属性包含一个指向 prototype 属性所在函数的指针。(通过实例的__proto__来访问构造函数的原型对象)
function Person2(name){
this.name = name;
}
Person2.prototype.sayName = function(){
console.log(this.name)
}
var name1 = new Person2('kaiser');
var name2 = new Person2('lindang');
//构造函数的原型对象上方法和属性被实例共享
name1.sayName(); //kaiser
name2.sayName(); //lindang

 

实例.__proto__ === 构造函数.prototype

 
原型链:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,相应地,另一个原型中也包含一个指向另一个构造函数的指针。如此层层递进,构成实例与原型的链条,这就是原型链的基本概念。
 
原型链继承
优点:引用类型的方法被所有实例共享,也就是说一个方法,可以到处使用
缺点:被所有子类实例共享属性,造成实例之前的属性会互相影响。
 function SuperType(){
this.name = 'kaiser'
this.colors = ['red','yello','green'];
}
SuperType.prototype.getName = function(){
return this.name;
}
function SubType(){}
SubType.prototype = new SuperType('dog');
SubType.prototype.constructor = SubType;
let instance = new SubType();
instance.colors.push('white');
let instance2 = new SubType();
console.log(instance.colors) //['red','yello','green','white']
console.log(instance2.colors) //['red','yello','green','white']

 

基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法。如 SubType.prototype = new SuperType();
 
借用构造函数继承
思想:在子类的构造函数中调用超类型的构造函数。
优势:相对于原型链而已,借用构造函数有一个很大的优势,即可以在子类型构造函数中向超类型构造函数传递参数。是因为属性是绑定到this上面的,所以调用到时互不影响。
劣势:仅借用构造函数,将无法避免方法都在构造函数中定义,因此函数复用就无从谈起。
function SuperType1(name){
  this.name = name;
  this.colors = ['red','green','pink'];
}
function SubType1(name){
  SuperType1.call(this,name)
}
let instance3 = new SubType1('kaiser');
instance3.colors.push('white');
let instance4 = new SubType1();
console.log(instance3.name,instance3.colors); //kaiser,["red", "green", "pink", "white"]
console.log(instance4.name,instance4.colors) //undefined,["red", "green", "pink"]

 

组合继承

将原型链和借用构造函数的技术结合在一起,从而发挥二者之长的一种继承模式。
特点:使用原型链实现对原型属性和方法的继承,通过借用构造函数来实现实例属性的继承,即通过在原型上定义方法来实现函数的复用,又保证实例都有自己的属性。
优势:组合继承避免了原型链和借用构造函数的缺陷,融合了它们的优点,成为js中最常用的继承模式.
劣势:组合继承最大的问题是无论什么情况下,都会调用两次超类型的构造函数:一次在创建子类型原型的时候,另一次在子类型构造函数内部。输入子类型最终会包含超类型对象的全部实例属性,但我们不得不在调用子类型构造函数时重写这些属性。
function SuperType2(name){
this.name = name;
this.colors = ['pink','blue','yellow'];
}
SuperType2.prototype.sayName = function(){
return this.name;
}
function SubType2(name,age){
SuperType2.call(this,name);
this.age = age;
}
SubType2.prototype = new SuperType2();
SubType2.prototype.constructor = SubType2;
SubType2.prototype.sayAge = function(){
return this.age
}
let instance5 = new SubType2('kaiser',22);
instance5.colors.push('red');
let instance6 = new SubType2('liming',20);
console.log(instance5.colors,instance5.sayAge()); // ['pink','blue','yellow','red'] 22
console.log(instance6.colors,instance6.sayName()); //['pink','blue','yellow'] liming

  

 

js继承的关系(一)的更多相关文章

  1. js继承之原型链继承

    面向对象编程都会涉及到继承这个概念,JS中实现继承的方式主要是通过原型链的方法. 一.构造函数.原型与实例之间的关系 每创建一个函数,该函数就会自动带有一个 prototype 属性.该属性是个指针, ...

  2. js继承的常用方法

    写在前面的话:这篇博客不适合对面向对象一无所知的人,如果你连_proto_.prototype...都不是很了解的话,建议还是先去了解一下JavaScript面向对象的基础知识,毕竟胖子不是一口吃成的 ...

  3. JS继承的一些见解

    JS继承的一些见解 js在es6之前的继承是五花八门的.而且要在项目中灵活运用面向对象写法也是有点别扭,更多的时候还是觉得面向过程的写法更为简单,效率也高.久而久之对js的继承每隔一段时间就会理解出现 ...

  4. JS继承的从入门到理解

    开场白 大三下学期结束时候,一个人跑到帝都来参加各厂的面试,免不了的面试过程中经常被问到的问题就是JS中如何实现继承,当时的自己也是背熟了实现继承的各种方法,回过头来想想却不知道__proto__是什 ...

  5. js 继承的几种方式

    JS继承的实现方式: 既然要实现继承,那么首先我们得有一个父类,代码如下: function Animal(name) { // 属性 this.name = name || '小白'; // 实例方 ...

  6. JS继承方式详解

    js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现 ...

  7. JS继承的实现方式

    JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一.那么如何在JS中实现继承呢?让我们拭目以待. JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个动物类 ...

  8. js继承机制的实现

    js继承机制的实现 1. 继承的概念 说明继承的最经典的例子:几何形状.实际上,几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边).圆是椭圆的一种,它只有一个焦点.三角形.矩形和五边形 ...

  9. JS继承的原理、方式和应用

    概要: 一.继承的原理 二.继承的几种方式 三.继承的应用场景 什么是继承? 继承:子类可以使用父类的所有功能,并且对这些功能进行扩展.继承的过程,就是从一般到特殊的过程.要了解JS继承必须首先要了解 ...

随机推荐

  1. Windows的远程协助和远程桌面的区别

    在Windows的“系统属性-远程”里面,包含了“远程协助”和“远程桌面”两个设置. 远程桌面我们平时用得比较多,但是远程协助却一直没明白什么作用.系统装完以后,“远程协助 - 允许远程协助连接这台计 ...

  2. C# 如何使用 Sql Server Compact 数据库

    Sql Server Compact Edition(简称SqlCE)是一个轻量级的数据库,对于放在客户机上的程序而有需要存储数据这样的环境,使用SqlCE再合适不过了.SqlCE可以通过在VS(Vi ...

  3. Android零基础入门第40节:自定义ArrayAdapter

    原文:Android零基础入门第40节:自定义ArrayAdapter ListView用起来还是比较简单的,也是Android应用程序中最重要的一个组件,但其他ListView可以随你所愿,能够完成 ...

  4. BuildWinRTL.dproj 用这个重新编译就行

    BuildWinRTL.dproj 用这个重新编译就行 我每次安装新版本,都删掉了这两个函数 {$IFDEF DEBUG}exports  dbkFCallWrapperAddr,{$IF defin ...

  5. Silverlight Virtualization Overview

    当ListBox使用StackPanel作为容器时,如果数据源包含大量数据时,每一条数据都要创建可视化的Item来承载数据,创建这些容器就需要消耗很多时间和内存,另外滚动也非常慢,因为需要计算所有这些 ...

  6. [2017.02.15] 《C++Primer5》 复习笔记

    编程语言主要是提供一个框架,用计算机能够处理的方式来表达问题的解决方法. 自定义数据类型class的基本思想是数据抽象dataabstraction和封装encapsulation.数据抽象是一种依赖 ...

  7. Django预备知识

    http协议 url: 协议://域名(IP)+端口(80)/路径?参数(a=1&b=2) 示例:https://www.baidu.com/s/?wd=aaa MVC M:mdoel 与数据 ...

  8. Java基础(二) 基本类型数据类型、包装类及自动拆装箱

    我们知道基本数据类型包括byte, short, int, long, float, double, char, boolean,对应的包装类分别是Byte, Short, Integer, Long ...

  9. impala学习笔记

    impala学习笔记 -- 建库 CREATE DATABASE IF NOT EXISTS database_name; -- 在HDFS文件系统中创建数据库,需要指定要创建数据库的位置. CREA ...

  10. Hexo+NexT(二):Hexo站点配置详解

    阅读本篇之前,假定读者已经有了Node.js的基础,如需要补充Node.js知识的,请自行百度. Hexo是在Node.js框架下的一个项目,利用Node.js提供的强大功能,完成从Markdown到 ...