经典的传承与 protoypal 继承在 JavaScript

JavaScript 是一门基于原型继承而非经典继承的语言。这意味着在 JavaScript 中,对象直接从其他对象继承属性和方法,而不是通过类来实现继承。这种继承方式被称为原型式继承,也叫做 protoypal 继承。

经典的传承

传统的面向对象编程语言使用经典的继承方式。经典继承的核心概念是“类”。一个类定义了对象的一组属性和方法,并且可以被实例化多次以创建新对象。当一个类被继承时,子类会继承其父类中定义的所有属性和方法。这个过程通常被称为子类“派生”自父类。

在经典继承中,每个对象都有一个内部的 [[Class]] 属性来表示它属于哪个类。而且,这个属性不能被修改。例如,如果我们创建了一个名为 Person 的类,并创建了一个名为 person1 的对象,则 person1[[Class]] 属性将始终为 "Person"

----- ------ -
  ----------------- -
    --------- - -----
  -
  
  ---------- -
    ------------------- -- ---- -- ----------------
  -
-

----- ------- - --- ----------------
------------------- ---------- -------- -- ----
-------------------------- -- -------
------------------- -- ------- -- ---- -- -------

protoypal 继承

在 JavaScript 中,没有类的概念。相反,JavaScript 中的对象是通过其他对象来继承属性和方法的。每个对象都有一个内部的 [[Prototype]] 属性,它指向另一个对象,这个对象被称为原型。当我们访问一个对象的属性或方法时,JavaScript 引擎会首先检查该对象本身是否具有此属性或方法,如果不存在,则会沿着 [[Prototype]] 链向上查找,直到找到该属性或方法或者到达链的末尾。

当我们创建一个新对象时,可以通过指定其原型来继承另一个对象的属性和方法。我们可以使用 Object.create() 方法来创建一个新对象,并将其原型设置为另一个对象。

----- --------------- - -
  ---------- -
    ------------------- -- ---- -- ----------------
  -
--

----- ------- - -------------------------------
------------ - --------
-------------------------------------------- -- ----
------------------------------------------------ -- -----
------------------- -- ------- -- ---- -- -------

在此示例中,我们定义了一个名为 personPrototype 的对象,并为其添加了一个 sayHello() 方法。然后,我们使用 Object.create() 方法创建了一个新对象 person1,并将其原型设置为 personPrototype。我们还向 person1 对象添加了一个 name 属性。

因为 person1 的原型是 personPrototype,所以它可以访问 sayHello() 方法。当我们尝试在 person1 上调用 sayHello() 方法时,JavaScript 引擎会首先检查 person1 自身是否具有该方法,发现不存在,然后沿着 [[Prototype]] 链向上查找,最终找到并执行 personPrototype 上的 sayHello() 方法。

指导意义

在学习 JavaScript 时,了解经典的传承和 protoypal 继承的区别非常重要。虽然这两种继承方式都可以实现对象之间的属性和方法共享,但它们的实现方式非常不同,因此可能需要使用不同的技

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/11959