在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”关键字。这种方式不需要使用构造函数或原型。例如:
--- ------ - - ----- -------- --- - ---------------------------------------------------------- -------- -------------------------------------------------------------------------------------