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