我通過CodeAcademy JS excercises工作,有一個關於這個例子的問題:JavaScript構造函數,原型附加方法,和「這個」
//Animal class
function Animal(name) {
this.name = name;
}
//Attach sayName method to Animal class
Animal.prototype.sayName = function() {
console.log("Hi my name is " + this.name);
};
//create an animal object instance
var dog = new Animal('Barker');
//invoke a method attached to the prototype from the object instance
dog.sayName();
我這個代碼的理解是:
- JS創建一個新的動物對象實例var dog指向作爲在調用函數之前使用new關鍵字的結果
Animal()
- 函數構造函數 - var dog對象的原型具有
sayName()
方法附連到它的行:Animal.prototype.sayName = function()
- 由於
sayName()
附着到類prototype
,該方法現可從Animal
類通過使用new Animal()
功能構造的創建的任何對象
這是正確理解這段代碼發生了什麼?
另外,我也想了解如何this
指向動物對象this.name
:
Animal.prototype.sayName = function() {
console.log("Hi my name is " + this.name);
};
不Animal.prototype
指向一個實際的對象:此Animal
對象實例的prototype
對象?如果是這樣,this
不應該this.name
指向Animal.prototype
,因爲sayName()
實際上是從Animal.prototype
被調用?
我對this
的上下文的理解是,this
總是指向調用該函數的對象。但是,在這種情況下,當dog.sayName()
被調用時,this
指向Animal
,這是this.name
等於'Barker'
當它被記錄到控制檯時。 我在猜測,要麼我誤解Animal.prototype指向原型對象,要麼JS在「幕後」做一些事情,在將方法附加到prototype
的上下文中將dog.sayName()
到this
關聯起來。
在這個小例子中有多個問題,但掌握這裏發生的事情真的會幫助我理解這些基本概念。
當一個構造函數被調用時,它會將其原型賦值給創建的對象的原型,這樣'dog'就可以完全訪問'Animal.prototype'的函數和屬性。你可以看一下http://qr.ae/RO44Vn以獲得關於JS的'this'的詳細信息。 – Redu