请考虑以下代码:
function Plant () {
this.country = "Mexico";
this.color= "yellow";
}
Plant.prototype.showDetails = function() {
console.log("I am from " + this.country + " and my color is " + this.color);
}
var banana = new Plant();
banana.showDetails(); //this outputs "I am from Mexico and my color is Yellow".
现在我的问题是,showDetails如何访问Plant函数的国家和颜色属性,即使它在函数之外? (Javascript根据功能,词法范围有范围)。
我做了一些内省,发现当调用banana.showDetails时,'这个'指植物对象而不是香蕉对象。为什么会这样?在JS,'这个'是指调用函数的对象,在本例中是香蕉对象。
答案 0 :(得分:1)
country
和color
不是Plant
函数的属性;它们是调用this
时绑定到Plant
的任何对象的属性。
执行new Plant()
会创建一个新对象,然后调用绑定到新对象的Plant
this
。
(在某种意义上,每个JavaScript函数都有两个参数,this
和arguments
,它们由每个函数调用设置(免责声明:不适用于"胖箭头"风格功能)。)
以下代码在道德上与您的代码等效,只是不使用构造函数/方法:
function Plant(x) {
x.country = "Mexico";
x.color = "yellow";
return x;
}
function showDetails(x) {
console.log("I am from " + x.country + " and my color is " + x.color);
}
var banana = Plant({});
showDetails(banana);
答案 1 :(得分:0)
您创建了香蕉对象作为新的Plant对象,因为您没有定义它自己的属性,而是使用Plant中定义的属性。
如果在banana上定义属性,如下所示:
banana.country = "Serbia";
banana.color = "red";
那么你将从香蕉属性中获取值。所以基本上这是指香蕉,但香蕉使用从植物继承的属性。