在 JavaScript 中,每个对象都有一个原型。原型是一个对象,它包含共享的属性和方法,这些属性和方法可以被对象实例继承。在过去,JavaScript 中仅存在构造函数原型,这意味着每个对象都必须是由构造函数创建的。但是从 ECMAScript 2020 开始,JavaScript 中还存在非构造函数原型,这为开发人员提供了更多的灵活性和控制力。
构造函数原型
在 JavaScript 中,每个函数都有一个原型对象,称为构造函数原型。当使用 new
关键字创建一个对象时,JavaScript 引擎会将构造函数的原型对象分配给新对象的原型属性。这意味着新对象可以访问构造函数原型对象中定义的属性和方法。
例如,以下代码创建了一个名为 Person
的构造函数,并将其原型对象中的 hello
方法添加到构造函数原型中:
-------- ------------ - --------- - ----- - ---------------------- - ---------- - ------------------- -- ---- -- --------------- - ----- ---- - --- --------------- ------------- -- --------- -- ---- -- ----
在上面的代码中,我们创建了一个 Person
构造函数,并将其原型对象中的 hello
方法添加到构造函数原型中。然后我们使用 new
关键字创建了一个 john
对象,并调用了 hello
方法。
非构造函数原型
在 ECMAScript 2020 中,JavaScript 引入了非构造函数原型。与构造函数原型不同,非构造函数原型是一个普通的对象,它可以作为一个对象的原型,而不是仅限于由构造函数创建的对象。
以下是一个示例,展示如何使用非构造函数原型作为对象的原型:
----- --------------- - - ------- - ------------------- -- ---- -- --------------- - -- ----- ---- - ------------------------------- --------- - ------- ------------- -- --------- -- ---- -- ----
在上面的代码中,我们创建了一个名为 personPrototype
的对象,并将其中的 hello
方法添加到该对象中。然后我们使用 Object.create
方法创建了一个新对象 john
,并将 personPrototype
对象作为其原型。最后我们设置了 john
对象的 name
属性,并调用了 hello
方法。
非构造函数原型的一个重要优点是,它可以更灵活地定义对象的原型。我们可以创建一个对象并将其原型设置为任何对象,而不仅仅是由构造函数创建的对象。这使得我们可以更容易地实现一些高级的原型继承模式。
总结
ECMAScript 2020 引入了非构造函数原型,这为 JavaScript 开发人员提供了更多的灵活性和控制力。与构造函数原型不同,非构造函数原型可以作为任何对象的原型,而不仅仅是由构造函数创建的对象。这使得我们可以更容易地实现高级的原型继承模式。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65fbb79fd10417a22274a986