在JavaScript中使用“原型”,而不是“这个”?

在JavaScript中,对象是基础。当我们创建一个对象时,它会自动从Object.prototype继承属性和方法。但是,在实践中,我们通常需要更具体的对象来满足我们的需求。这就是为什么JavaScript提供了两种创建对象的方式:通过构造函数或通过字面量。

构造函数和原型

构造函数是一种用于创建对象的特殊函数。当我们使用 new 关键字调用构造函数时,它将返回一个新的对象。例如:

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

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

在上面的例子中,Person函数是一个构造函数,用于创建一个新的Person对象。我们可以使用 new 关键字来调用该函数,并将其分配给变量person1。现在person1对象具有name和age属性,这些属性是通过构造函数设置的。

另一个创建对象的方式是使用字面量。例如:

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

在上面的例子中,我们使用字面量语法来创建一个名为person2的新对象。该对象包含name和age属性。

在JavaScript中,每个对象都有一个隐藏的属性[[Prototype]],它引用该对象的原型。原型是一个对象,包含共享属性和方法,可以在所有实例之间共享。在上面的例子中,person1和person2对象的原型都是Object.prototype。

我们可以使用构造函数和原型来创建对象和继承属性和方法。例如:

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

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

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

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

在上面的例子中,我们向Person的原型添加了一个名为sayHello的方法。当我们创建新的Person对象时,它们都将继承该方法。现在我们可以调用person1和person2的sayHello方法,并输出消息。

原型链

当我们访问一个对象的属性或方法时,JavaScript会首先查找该对象本身是否具有该属性或方法。如果它没有,则会查找它的原型,以及原型的原型,直到找到该属性或方法或到达Object.prototype为止。这就是所谓的原型链。

例如:

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

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

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

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

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

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

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

在上面的例子中,我们创建了一个名为Student的新构造函数,它继承自Person。我们使用Object.create方法将Student的原型设置为Person的原型,并将constructor属性设置为Student本身。现在,当我们创建一个新的student1对象时,它将继承Person和Student的属性和方法,并可以调用sayHello和sayGrade方法。

使用“这个”引用

另一种创建对象的方式是使用“this”关键字。这种方式不需要使用构造函数或原型。例如:

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

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