zoukankan      html  css  js  c++  java
  • JavaScript中的继承

    一、原型链(默认)

    function Person(){};

    function Student(){};

    Student.prototype = new Person();

    Student.prototype.constructor = Student;

    缺点:1、传参怎么搞 ? 2、new Person的实例属性成了Student的原型属性

    二、借用构造函数

    function Person(name) { this.name = name;}

    function Student(name, klass) { Person.call(this, name);  this.klass = klass;}

    优点:传参搞定了哦  缺点:方法继承呢 继承 呢

    三、组合继承(原型链+借用构造函数)

     1 function Person(name){
     2     this.name = name;
     3 }
     4 
     5 function Student(name, klass){
     6     Person.call(this, name);
     7     this.klass = klass;
     8 }
     9 
    10 Student.prototype = new Person();
    11 Student.prototype.constructor = Student;

    还存在缺点:1、new Person的实例属性成了Student的原型属性  2 Person构造函数被调用了两次,效率低下

    四、临时构造函数

     1 function Person(name){
     2     this.name = name;
     3 }
     4 
     5 function Student(name, klass){
     6     Person.call(this, name);
     7     this.klass = klass;
     8 }
     9 
    10 (function(){
    11     var F = function(){};
    12     F.prototype = Person.prototype;
    13     Student.prototype = new F();
    14     Student.prototype.constructor = Student;
    15 })();

    看起来不错哦~~

    但素,JavaScript为啥非得类式继承捏

    重点来了,

    原型继承

    Student.prototype = Object.create(Person.prototype);

    Student.prototype.constructor = Student;

    原型链,链起来:new student() -----> Student.prototype----->Person.prototype-----> Object.Prototype 

    把你的心,我的心,串一串,串一株幸运草,串一个同心圆~~

    Object.create polyfill

    if(typeof Object.create !== 'function'){
        Object.create = function(o){
            var F = function(){};
            F.prototype = o;
            return new F();
        }
    }

    额外的,通过复制属性实现继承

     1 function extendDeep(parent, child){
     2     var i;
     3     child = child || {};
     4     for(i in parent){
     5         if(parent.hasOwnProperty(i)){
     6             if(typeof parent[i] === 'object'){
     7                 child[i] = (Object.prototype.toString.call(parent[i]) === '[object Array]') ? [] : {};
     8                 extendDeep(parent[i], child[i]);
     9             }else{
    10                 child[i] = parent[i];
    11             }
    12         }
    13     }
    14     return child;
    15 }
  • 相关阅读:
    设置iterm可配色
    Java权限管理
    npm添加淘宝镜像
    新版同义词
    maven打包加时间戳方法总结
    python中的实例方法、类方法、静态方法的区别
    15个流行的python框架
    python学习笔记
    前置声明和包含头文件的区别(待补充)
    数组和链表的时间复杂度
  • 原文地址:https://www.cnblogs.com/redking-fighting/p/6250720.html
Copyright © 2011-2022 走看看