资讯专栏INFORMATION COLUMN

原型继承、构造函数继承、组合继承法

rockswang / 1932人阅读

摘要:组合继承法把父对象方法挂载到父类的原型对象上去,实现方法复用原型的构造函数指向程序员

原型继承
function Person(name,sex){
    this.name=name;
    this.sex=sex;
    this.friends = {lily:"female",lucy:"female"};
    this.showFriends=function(){
        var str = ""
        for(i in this.friends){
            str+=i +" "+this.friends[i] +",";
        }
        console.log("my friends:"+str);
    }
}
Person.prototype.hello=function(){
    console.log("hello:"+this.name);
}

var per1 =  new Person("A","male");
per1.hello();
per1.showFriends();


function Student(className){
    this.class = className;
}

Student.prototype = new Person("B","male");//原型继承将子对象的原型对象指向父对象的实例 ; 缺点:不能由子对象像父对象传递参数,

var stu1 = new Student(1);//不能由子对象像父对象传递参数,
stu1.name="C";
stu1.hello();
stu1.friends.C = "male";//2、对于引用型的属性修改之后会印象其他的实例对象;
stu1.showFriends();//2、对于引用型的属性修改之后会印象其他的实例对象;

console.log("stu1 instanceof Student: ");
console.log(stu1 instanceof Student);
console.log("stu1 instanceof Person: ");
console.log(stu1 instanceof Person);

var stu2 = new Student(2);
stu2.name="D";
stu2.hello();
stu2.showFriends();//2、对于引用型的属性修改之后会印象其他的实例对象;

console.log("stu2 instanceof Student: ");
console.log(stu2 instanceof Student);
console.log("stu2 instanceof Person: ");
console.log(stu2 instanceof Person);

缺点:1、不能由子对象像父对象传递参数,2、对于引用型的属性修改之后会印象其他的实例对象;
构造函数继承
//构造函数继承
function Teacher(name,sex,type){
    this.type=type;
    Person.call(this,name,sex);
}

var tea1 = new Teacher("E","female","数学");
//tea1.hello(); //报错没有继承到原型上的方法
tea1.friends.F = "male";
tea1.showFriends();

var tea2 = new Teacher("G","male","语文");
tea2.friends.H = "male";
tea2.showFriends();
console.log("tea2 instanceof Teacher: ")
console.log(tea2 instanceof Teacher);
console.log("tea2 instanceof Person: ")
console.log(tea2 instanceof Person);

缺点:1、不能继承父对象原型上的方法 2、每次实例化对象会重新构建函数,浪费内存。
组合继承法
把父对象方法挂载到父类的原型对象上去,实现方法复用
function Worker(name,sex,job){
    this.job = job;
    Person.call(this,name,sex)
}
Worker.prototype = new Person();
Worker.prototype.constructor = Worker;//原型的构造函数指向worker

var wor1 = new Worker("I","female","程序员");
wor1.hello();
wor1.friends.J = "male";
wor1.showFriends();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102277.html

相关文章

  • JavaScript面向对象---原型继承

    摘要:因为这造成了继承链的紊乱,因为的实例是由构造函数创建的,现在其属性却指向了为了避免这一现象,就必须在替换对象之后,为新的对象加上属性,使其指向原来的构造函数。这个函数接收两个参数子类型构造函数和超类型构造函数。 最近一直在研究js面向对象,原型链继承是一个难点,下面是我对继承的理解以下文章借鉴自CSDN季诗筱的博客 原型链继承的基本概念: ES中描述了原型链的概念,并将原型链作为实现...

    vspiders 评论0 收藏0
  • js继承的理解

    摘要:创建自定义的构造函数之后,其原型对象只会取得属性,其他方法都是从继承来的。优缺点寄生式继承在主要考虑对象而不是创建自定义类型和构造函数时,是十分有用的。 原文链接:https://kongchenglc.coding.me... 1.原型链   js的继承机制不同于传统的面向对象语言,采用原型链实现继承,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。理解原型链必须先理...

    BlackFlagBin 评论0 收藏0
  • JavaScript继承方式详解

    摘要:可以通过构造函数和原型的方式模拟实现类的功能。原型式继承与类式继承类式继承是在子类型构造函数的内部调用超类型的构造函数。寄生式继承这种继承方式是把原型式工厂模式结合起来,目的是为了封装创建的过程。 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念。...

    Yangyang 评论0 收藏0
  • 浅谈原型继承、借助构造函数组合方式继承

    摘要:想要解决这样的问题的话,可以借助构造函数也可以叫做伪造对象或经典继承。这种方式实现非常简单,就是在子对象的构造函数中调用父对象的构造函数。 原型式继承 原型式继承,就是一定一个函数,该函数中创建一个临时性的构造函数,将作为参数,传入的对象作为这个构造函数的原型,最后返回这个构造函数的实例对象 /*定义函数:用于实现对象之间的继承 参数: obj:表示继承关系中的父级对象...

    wangjuntytl 评论0 收藏0
  • JavaScript系列--浅析原型链与继承

    摘要:综上所述有原型链继承,构造函数继承经典继承,组合继承,寄生继承,寄生组合继承五种方法,寄生组合式继承,集寄生式继承和组合继承的优点于一身是实现基于类型继承的最有效方法。 一、前言 继承是面向对象(OOP)语言中的一个最为人津津乐道的概念。许多面对对象(OOP)语言都支持两种继承方式::接口继承 和 实现继承 。 接口继承只继承方法签名,而实现继承则继承实际的方法。由于js中方法没有签名...

    draveness 评论0 收藏0
  • js继承构造函数继承原型继承组合继承组合继承优化、寄生组合继承

    摘要:创建子类实例,可以向父类构造函数传参数。修复如下其实方式组合继承优化核心通过这种方式,砍掉父类的实例属性,这样在调用父类的构造函数的时候,就不会初始化两次实例,避免组合继承的缺点。优点只调用一次父类构造函数。 2018.06.03 第一部分:导入 1、构造函数的属性 funcion A(name) { this.name = name; // 实例基本属性 (该属性,强调私有,...

    孙淑建 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<