返回

JavaScript面向对象之原型

前端

一、写在前面

本次内容全部是js的,没有ts内容,学习这些内容是为了之后更好的学习ts,如果不学习这些内容可能会导致之后ts的学习有地方难以理解。

二、面向对象之原型

假设我需要用js造一个小兵,以便以后造一队小兵。

var soldier = {
  name: '小兵',
  hp: 100,
  attack: function () {
    console.log('士兵攻击!');
  },
};

现在我想要造第二个小兵,如果我直接把上面的代码复制一遍,那么这两个小兵就完全一样了,这显然不是我想要的结果。

于是我想到了一个办法,我可以在第一个小兵的基础上再造一个新的士兵。

var soldier2 = Object.create(soldier);
soldier2.name = '小兵2';

这样,我就造出了一个新的士兵,而且这个士兵和第一个士兵一样,都有name、hp和attack属性。

但是,如果我想让士兵2的攻击力比士兵1高一些,我该怎么做呢?

我可以在士兵2的attack函数中增加一个参数,表示攻击力。

soldier2.attack = function (damage) {
  console.log('士兵2攻击!造成' + damage + '点伤害');
};

这样,士兵2的攻击力就比士兵1高了。

三、原型链

在JavaScript中,每个对象都有一个原型对象,原型对象也是一个对象。

原型对象的目的是共享属性和方法,以便子对象可以使用这些属性和方法。

在上面的例子中,soldier2的原型对象是soldier。

我们可以通过以下代码来访问soldier2的原型对象:

console.log(soldier2.__proto__);

四、构造函数

在JavaScript中,构造函数是一个特殊的函数,它用于创建对象。

构造函数的名称一般以大写字母开头,例如:

function Soldier() {
  this.name = '小兵';
  this.hp = 100;
  this.attack = function () {
    console.log('士兵攻击!');
  };
}

我们可以使用new来调用构造函数,从而创建对象。

var soldier = new Soldier();

当我们使用new关键字调用构造函数时,构造函数会执行以下操作:

  1. 创建一个新的对象。
  2. 将新对象的原型对象设置为构造函数的prototype属性。
  3. 将新对象的this关键字指向新对象。
  4. 执行构造函数的函数体。

五、Object.create

Object.create()方法可以创建一个新的对象,并指定该对象的原型对象。

var soldier2 = Object.create(soldier);

这与以下代码的效果相同:

var soldier2 = new Soldier();

六、call和apply

call()和apply()方法可以改变函数的this关键字。

soldier2.attack.call(soldier1);

这将调用soldier2的attack函数,但是将soldier1作为this关键字。

soldier2.attack.apply(soldier1);

这与call()方法的效果相同,但是apply()方法的第二个参数是一个数组,而不是一组参数。

七、总结

原型是JavaScript面向对象编程的核心概念之一。

原型链是JavaScript中对象之间的一种继承关系。

构造函数是一种用于创建对象的特殊函数。

Object.create()方法可以创建一个新的对象,并指定该对象的原型对象。

call()和apply()方法可以改变函数的this关键字。

通过对这些知识点的理解,我们可以更好地理解JavaScript的面向对象编程。