原型如何通过"这个"?访问构造函数的成员?

时间:2016-06-05 21:01:32

标签: javascript prototype

请考虑以下代码:

  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,'这个'是指调用函数的对象,在本例中是香蕉对象。

2 个答案:

答案 0 :(得分:1)

countrycolor不是Plant函数的属性;它们是调用this时绑定到Plant的任何对象的属性。

执行new Plant()会创建一个新对象,然后调用绑定到新对象的Plant this

(在某种意义上,每个JavaScript函数都有两个参数,thisarguments,它们由每个函数调用设置(免责声明:不适用于"胖箭头"风格功能)。)

以下代码在道德上与您的代码等效,只是不使用构造函数/方法:

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"; 那么你将从香蕉属性中获取值。所以基本上这是指香蕉,但香蕉使用从植物继承的属性。