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;
  }
 

最新文章

  1. Introduction to Microsoft Dynamics 365 licensing
  2. A股博弈笔记
  3. URAL 1346. Intervals of Monotonicity(DP)
  4. 将spring源码导入到eclipse中
  5. post和put的区别
  6. 2015南阳CCPC C - The Battle of Chibi DP
  7. 解决从linux本地文件系统上传文件到HDFS时的权限问题
  8. ios开发之UIView的frame、bounds跟center属性的区别(附图)
  9. EXT ajax简单实例
  10. 让VC编译出来的程序不依赖于msvcr80.dll/msvcr90.dll/msvcr100.dll等文件
  11. php的memcache和memcached扩展区别【转载】
  12. postfix+dovecot配置多域名邮件服务器
  13. Linux 下实时查看日志
  14. KiKi's K-Number
  15. JAVA实现网页上传头像
  16. CentOS7.3安装Go运行和开发环境
  17. Nginx 安装学习笔记(1.安装和启动)
  18. Linux shell判断文件和文件夹是否存在(转发)
  19. Sublime text 3搭建Python开发环境及常用插件安装
  20. Mac安装Linux的KVM管理工具virt-manager

热门文章

  1. 副三角形行列式转成上(下)三角形行列式为什么依次对换而不用第n行直接对换首行,第n-1行直接对换次行
  2. grafana嵌入iframe,去除菜单和上方工具条
  3. 配置隐藏index.php
  4. 解决linux conda 命令行环境提示消失的方法
  5. golang 用gorm生成module文件
  6. java 注解基础
  7. git commit提交代码时跳过 eslint校验
  8. WPS中VB编辑器的安装
  9. BLOG-2
  10. 1. mongodb基础:cursor.forEach使用