javascript是为了成为轻量级的语言而开发的。开发者并没有选择像其他面向对象的语言一样,定义类(class),而是使用了protopype实现继承。

每一个函数在创建时,都会创建它的Prototype.

而这个函数,如果被用来创造实例,则被称为构造函数(constructor)。

在c++语言中,构造函数是这样的.

class A{
  public:
    A();//声明constructor
}

在js中,被实例化出的对象,拥有一个属性。指向它的构造函数。

function A(){}
let a = new A()
a //A {} ,如下图
a.__proto__.constructor 即构造函数。
A.prototype具有一个constructor属性,指向A本身: ƒ A()

继承的意义,简单来说,就是把相同的数据或方法,存在同一块内存地址中,可以被不同的实例使用(节省空间)。

如果两个实例,拥有同一个prototype,那么它们就可以共用这个prototype。

对象间"继承"的方法:

1.如果构造函数不同的实例,怎样使用相同的prototype呢?

  答案1 ,apply || call (构造函数继承)

 function Human(){
    this.species = "人类";
  }   function Man(name){
Human.apply(this,arguments);
    this.name = name;
  }
let kk = new Man("kk");
kk.name //"kk"
kk.species //"人类"

  答案2,覆盖prototype(原型链继承)

  function Human(){
    this.species = "人类";
  }   function Man(name){
    this.name = name;
  }   Man.prototype = new Human();//使用实例替换原来的prototype
Man.prototype.constructor = Man;//替换实例的constructor。
let p = new Man("p")

  答案3,组合继承(1,2两种都用。)也就是说,既有了复制过来的属性,然后又可以用prototype。

  答案4:在prototype上面定义属性,而不是this。(原型继承?)

Human.prototype.like ="sugar";
Man.prototype = Human.prototype;//同样替换了Prototype.但是此时的prototype就是Human的prototype,就不可以替换掉它的constuctor了。
let e = new Man("e");
e.like//"sugar"

  答案4:拷贝继承.

  把其他prototype上的方法复制到自己的Prototype上。

2,如果要继承的对象并没有构造函数如何实现继承呢?

  1.把要继承的对象附加到原型链上

function copyObject(parent){
var f = function(){};
f.prototype = parent;
return new f();
}
let hair = {
hairType:"black"
} let t = copyObject(hair);
t.hair //"black"

  2.deep copy

  function deepCopy(p, c) {

    var c = c || {};

    for (var i in p) {

      if (typeof p[i] === 'object') {

        c[i] = (p[i].constructor === Array) ? [] : {};

        deepCopy(p[i], c[i]);

      } else {

         c[i] = p[i];

      }
    }     return c;
  }
 

js原型,继承的更多相关文章

  1. 【09-23】js原型继承学习笔记

    js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...

  2. JS原型继承与类的继承

    我们先看JS类的继承 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  3. js原型继承四步曲及原型继承图

    一:js原型继承四步曲 //js模拟类的创建以及继承 //动物(Animal),有头这个属性,eat方法 //名字这个属性 //猫有名字属性,继承Animal,抓老鼠方法 //第一步:创建父类 fun ...

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

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

  5. 关于js原型继承

    js的每个类都有一个prototype对象 访问对象的属性时,会先访问到对象自身是否有定义这个属性 如果没有定义,就会去访问对象所属类型的prototype对象是否有此属性 原型继承就是把类型的pro ...

  6. js原型继承

    原型链: Object(构造函数) object(类型(对象)) var o = {}; alert(typeof o); //结果是object alert(typeof Object); //结果 ...

  7. js原型继承深入

    js采用原型继承来实现类的派生,但是原型链再深入点,我们又知道多少呢,现在不妨往下看: 先来一个原型继承: var M1 = function() { this.param = "m1's ...

  8. 前端面试题总结二(js原型继承)

    今天这篇文章整理了JS原型和继承的一些知识点,面试的时候  基!本!都!会!问!还不快认真阅读下文,看看你还有哪些知识点需要掌握吧~ 1.原型链 基本思想:利用原型让一个引用类型继承另外一个引用类型的 ...

  9. JS 原型继承的几种方法

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

  10. JS 原型 & 继承

    理解原型链 先看看http://www.ituring.com.cn/article/56184和http://www.cavabiao.com/prototype-and-inherit-of-ja ...

随机推荐

  1. 一次k8s docker下.net程序的异常行为dump诊断

    背景 昨天,一位朋友找到我寻求帮助.他的项目需要调用一个第三方项目的webAPI.这个webAPI本身可从header, query string中取相关信息,但同事发现他在调用时,无法按期望的那样从 ...

  2. node.js 中删除,修改等接口

    1.首先是引入模块.闯将服务器,设置路由等 二.查询员工接口 三.添加员工接口 四.删除员工接口 五.修改员工接口

  3. gmgo国密算法库

    gmgo国密算法库 一.背景介绍 基于go1.17.5实现的国密算法库,包括: sm2 : 基于emmansun/gmsm的sm2部分实现部分扩展. sm3 : 基于emmansun/gmsm的sm3 ...

  4. vue项目中禁用浏览器缓存配置案例

    项目发布新版本,部署线上后用户浏览器需要清理缓存 1.public文件夹中修改 index.html文件meta配置 <meta http-equiv="Cache-Control&q ...

  5. Matplotlib 网格线

    我们可以使用 pyplot 中的 grid() 方法来设置图表中的网格线. grid() 方法语法格式如下: matplotlib.pyplot.grid(b=None, which='major', ...

  6. 【剑指Offer】【树】【双向链表】二叉搜索树与双向链表

    题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. A:二叉树中每个节点都有一个left指针指向左节点,一个right指针指向右节 ...

  7. VUE学习-渲染函数

    渲染函数 x-template 引入外面组件文件写法 <template> <h1 v-if="level === 1"> <slot>< ...

  8. Apache druid笔记

    Apache Duid学习笔记2 1.历史节点的查询效率与内存数据比成正比,内存越大则读取磁盘的次数越少, 历史节点内存越大总数据量越小则查询速度越快. 2.缓存机制可以选择外部和内部缓存,外部缓存如 ...

  9. Centos 7.9 基于二进制文件部署kubernetes v1.25.5集群

    简述 Kubernetes(简称为:k8s)是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器 ...

  10. 集合(Collection)

    前几天做数据结构题碰到了集合,当时并没有学,只是通过做题对此稍微有了了解.今天正好学到了,来做一下学习记录. 一.集合总体框架 由上图可知,集合的实现方式有两大类: (1)线性接口:该集合的顶层接口是 ...