js面向对象之继承相关知识

一、继承的定义

继承定义:通过【某种方式】让一个对象可以访问到另一个对象中的属性和方法,我们把这种方式称之为继承 并不是所谓的xxx extends yyy。为什么使用继承?有些对象会有方法(动作、行为),而这些方法都是函数,如果把这些方法和函数都放在构造函数中声明就会导致内存的浪费。

二、继承分类

1、原型链继承

A、Dog.prototype.say = function(){}/*继承单个方法时*/
B、Dog.prototype={/*继承多个方法时*/
		constructor:Dog; /*不破坏原有的原型对象结构*/
		a1:function(){}
		a2:function(){}
}
var dog = new Dog();/*先替换原型后创建对象,否则会导致旧方法访问不了*/

2、拷贝继承(混入拷贝)(mixin)
使用场景:有时候想使用某个对象中的属性,但是又不能直接修改它,于是就可以创建一个该对象的拷贝。
浅拷贝和深拷贝:
浅拷贝只是拷贝一层属性,没有内部对象
深拷贝其实是利用了递归的原理,将对象的若干层属性拷贝出来

var students=[
    {name:"",age:""},
    {name:"",age:""}
]

上面的代码很明显无法重用,实际代码编写过程中,很多时候都会使用拷贝继承的方式,所以为了重用,可以编写一个函数把他们封装起来:

/*子类继承父类的方法*/
function extend(obj1,obj2){
	for(var attr in obj2){
		obj1[attr] = obj2[attr];
	}
	 return obj1;
}
/*继承*/
extend(Star.prototype,Person.prototype);
/*再定义子类特有的方法:*/
Star.prototype.showJob = function(){}

es6中有了 <对象扩展运算符> :

  var Person={name:"李白",age:15}
   /*让Star是一个新对象,同时拥有了name、age属性*/
  var Star={ ...Person}
  var target2={ ...Person,age:18 }

三、原型式继承

场景:
a、创建一个纯洁的对象:对象什么属性都没有
b、创建一个继承自某个父对象的子对象

var parent={ age:18,gender:"男"};
var children=Object.create(parent);
//children.__proto__ === parent

使用方式:空对象:Object.create(null)

 var o1={ say:function(){} }
 var o2=Object.create(o1);

四、借用构造函数实现继承

场景:适用于两种构造函数之间逻辑有相似的情况
原理:函数的call、apply调用方式

原实现方式:

function Animal(name,age){
  this.name=name;
  this.age=age;
}
function Person(name,age,say){
  this.name=name;
  this.age=age;

  this.say=function(){
  }
}

局限性:Animal(父类构造函数)的代码必须完全适用于Person(子类构造函数)
借用构造函数实现:

function Animal(name,age){
    this.name=name;
    this.age=age;
}
function Person(name,age,say){
	//call改变this指向,使子类拥有父类的所有属性
	//call(thisObj,Object)和apply(thisObj,[argArray])的区别:apply传入的参数是数组,call传入超过三个参数性能会变差。
    Animal.call(this,name);
    //this.name=name;
    //this.age=age;
    this.say=say;
}

补充
对象中几乎都会有一个__proto__属性,指向他的父对象,这样可以实现让该对象访问到父对象中相关属性。

   function Animal(){}
   var cat=new Animal();
    //cat.__proto__:Animal.prototype
    //cat.__proto__.__proto__:根对象

万物继承自Object? ×

由于本人是新学的前端知识,想把学习的内容记录下来便于查看,如果哪里有问题,欢迎大家指出来
上一篇:JS面向对象基础知识
下一篇:Promise、async/await

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值