markdown JS实现继承的几种方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown JS实现继承的几种方式相关的知识,希望对你有一定的参考价值。

### 父类

```
// 定义一个动物类
function Animal (name) {
  // 属性
  this.name = name || 'Animal';
  // 实例方法
  this.sleep = function(){
    console.log(this.name + '正在睡觉!');
  }
}
// 原型方法
Animal.prototype.eat = function(food) {
  console.log(this.name + '正在吃:' + food);
};
```

### 原型链继承

>在JS中没有类的概念,继承是通过对象和对象之间实现的。其中主要是利用prototype属性来实现的

>函数中的prototype属性,又叫原型对象。构造函数可以通过prototype属性来添加函数。这样做到代码的简单性,避免冗余代码。还可以通过prototype属性来实现继承

>将父类的实例作为子类的原型

```
function Cat(){ 
}
Cat.prototype = new Animal();
Cat.prototype.name = 'cat';

// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.eat('fish'));
console.log(cat.sleep());
console.log(cat instanceof Animal); //true 
console.log(cat instanceof Cat); //true
```

>.prototype

>.call

>.apply

>call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组

```
// Person类:
function Person(name,age) {
  this.name = name;
  this.age = age;
}

// Student类:
function Student(name,age,height) {
  Person.apply(this,arguments); //当 this 为 null 时,最后的输出为:name:undefined  age:undefined  height:173
  //Person.call(this,name,age,height);   //call方法的传参方式;    
  this.height = height;
}

// 实例化:
var student = new Student("chams",22,"173");

// 测试:
console.log("name:" + student.name + "  age:" + student.age + "  height:" + student.height);
//name:chams  age:22  height:173

// Student类中并没有name和age属性,但是通过apply和call的继承,使Student类继承了Person类中的成员方法

function Animal(words){
  this.words=words,
  this.say=function(){
    console.log(this.words);        
  }        
}
function Cat(words){
   Animal.call(this,words);       
}
var cat = new Cat('Miao');
cat.say();//Miao
```

>什么情况下用apply,什么情况下用call

>在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,并且在调用Person的时候参数的列表是对应一致的(也就是Person和Student的参数列表前两位是一致的) 就可以采用 apply , 

>如果我的Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade),这样就可以用call来实现了,也就是直接指定参数列表对应值的位置(Person.call(this,age,name,grade))

>apply可以将一个数组默认转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3)

```
var arr1=new Array("1","2","3");  
var arr2=new Array("4","5","6");  
Array.prototype.push.call(arr1,arr2);  
arr1 // ["1", "2", "3", ["4", "5", "6"]]

var arr1=new Array("1","2","3");  
var arr2=new Array("4","5","6");  
Array.prototype.push.apply(arr1,arr2);  
arr1 // ["1", "2", "3", "4", "5", "6"]

// Array.prototype.push native code
function push(obj, value){
  if(typeof obj.length !== 'number'){
    obj.length = 0;
  }
  obj[obj.length] = value;
  obj.length += 1;
}
```

```
var max = Math.max.call(null, 5, 6, 2, 3, 7 );
max
7

var numbers = [5, 6, 2, 3, 7];
var max = Math.max.apply(null, numbers);
max
7

var numbers = [5, 6, 2, 3, 7];
var max = Math.max.call(null, numbers);
max
NaN

var numbers = [5, 6, 2, 3, 7];
var max = Math.max.apply(null, 5, 6, 2, 3, 7 );
max
Uncaught TypeError: CreateListFromArrayLike called on non-object
```

### 参考

[Function.prototype.call()](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/call)

[JS实现继承的几种方式](https://www.cnblogs.com/humin/p/4556820.html)

以上是关于markdown JS实现继承的几种方式的主要内容,如果未能解决你的问题,请参考以下文章

JS实现继承的几种方式

JS实现继承的几种方式

js继承的几种方式

JS实现继承的几种方式(转)

JS实现继承的几种方式

JS继承以及继承的几种实现方式总结