js组合继承(原型继承+借用构造函数继承)


组合继承就是将原型链和构造函数结合起来发挥二者优势的一种模式。继承:是类型与类型之间的继承继承目的:把子类型相同成员提取到父类型,实现代码重用
大体思路是:使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承,很好地解决了原型链继承的缺点,是较为常用的一种继承方式。//一:借用构造函数(借用父类型extend)  缺点:无法继承父类型的方法//父类型    
function Person(name,age,sex){  this.anme=name;this.age=age;this.sex=sex;}Person.prototype.sayHi=function (){  console.log(this.name);}//子类型function Student(name,age,sex,score){  Person.call(this,name,age,sex);  //借用父类型extend

   this.score=score; }

Student.prototype.siyou = function () {

console.log(‘只是Student私有,Person访问不到‘)

}

 
var s1=new Student(‘李克强‘,19,‘男‘,100);console.dir(s1);

//二:原型继承 缺点:无法设置参数Student.prototype= new Person();Student.prototype.constructor=Student;

// Student.prototype = Person.prototype; //原型extend

// 但是这样写,会造成子类型添加了私有方法其他的子类型 或者 父类型 都能访问到

// 因为堆内存中prototype 只有一个,Student.prototype = Person.prototype

// 只是赋值给Student.prototype一个引用地址,他们都指向内存中的同一个 prototype

 

// new Person() 是:Person实例对象(作为Student的原型对象)

//实现原型继承 必须将 constructor 指向自身

//否则的话:Student.prototype 的__proto__指向Person

 

//扩展:如何证明  fn是Function的实例对象?

fn.__proto__ ===Function.prototype  //true

 
 


时间: 2024-10-12 22:07:39

js组合继承(原型继承+借用构造函数继承)的相关文章

javascript继承,原型继承,借用构造函数继承,混合继承

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getS

JS继承之借用构造函数继承和组合继承

根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术(有时候也叫做伪造对象或经典继承).这种技术的基本思想相当简单,即在子类型构造函数的内部调用超类型构造函数. 基本模式 function SuperType(){ this.colors = ["red", "blue", "green"]; } fu

js继承之借用构造函数继承

一.原型链的缺点 1.1 单纯的原型链继承最大的一个缺点,在于对原型中引用类型值的误修改. 先看一个例子: //父类:人 function Person () { this.head = '脑袋瓜子'; } //子类:学生,继承了"人"这个类 function Student(studentID) { this.studentID = studentID; } Student.prototype = new Person(); var stu1 = new Student(1001);

JavaScript继承-借用构造函数继承

借用构造函数继承是在子类型构造函数的内部调用超类型狗在函数,通过使用apply()和call()方法 function girlFriend(){ this.girls = ['chen','wang','zhu']; } function Person(){ girlFriend.call(this,20); } var wang = new Person(); var zhu = new Person(); wang.girls.push('zhang'); console.log(wang

JavaScript构造函数+原型创建对象,原型链+借用构造函数模式继承父类练习

虽然经常说是做前端开发的,但常常使用的技术反而是JQuery比较多一点.在JavaScript的使用上相对而言少些.尤其是在创建对象使用原型链继承上面,在项目开发中很少用到.所以今天做个demo练习一下,以后忘记了也可以照搬一下. 说明一下: 1. Demo中使用的是构造函数+原型模式创建的对象.构造函数中存储对象实例使用的属性,原型模式增加实例使用的方法. 2. Demo中的继承分为两个方面.一个是属性继承,使用的是借用构造函数模式 call()方法.另一个是方法继承,这个就是使用原型方式继承

JavaScript ES5类 原型 原型链 组合、原型、寄生式继承

ES5类 原型  原型链 继承 JavaScript中,原型是相对于构造函数(类)的叫法(或者说概念),原型链是相对于构造函数(类)的实例对象的叫法. 对于JavaScript对象,如果在对象自身上找不到该属性,那么就会向上沿着原型链继续查找该属性 创建一个ES5类 在ES5中,类是由函数名首字母大写的函数,通过关键字new创建的. 类的构造函数就是函数自身 一般情况下,ES5类的原型对象prototype是自身构造函数,该类的实例化对象的原型链对象__proto__也是该构造函数,这二者指向同

js继承之一(借用构造函数)

现在,已经知道了原型对象,原型链的实现,原型链式继承的缺陷;那么如何避免这个缺陷? 在子类中借用父类的构造函数 //定义一个CarModel类 function CarModel(c){ this.color=c||"白色"; this.arr=[1,2,3]; this.getColor=function(){ console.log('我的颜色是'+this.color); } } //car类有自己的属性,比如品牌 function Car(brand){ CarModel.ca

JS面向对象与原型

面向对象与原型一.创建对象 1.基本方法 1 var box = new Object(); //创建对象 2 box.name = 'Lee'; //添加属性 3 box.age = 100; 4 box.run = function(){ //添加方法 5 return this.name + this.age + '运行中...'; //this表示当前作用于下的对象 6 }; 7 8 alert(box.run()); 9 10 alert(this.anme); //这里的this代表

js继承之二(组合模式=借用构造函数+原型链方式)

借用构造函数模式:不能继承原型上的属性,可以避免引用类型修改问题 原型链:能够继承原型上的属性,会发生引用类型修改 so:敲黑板! function CarModel(c){ this.color=c||"白色"; this.arr=[1,2,3]; this.getColor=function(){ console.log('我的颜色是'+this.color); } } CarModel.prototype.test="lla"; function Car(br