Javascript:“安全”对象如何工作?

时间:2017-02-28 10:43:31

标签: javascript oop javascript-objects

所以,这段代码片段非常方便,但我对它的工作方式有点惊讶。

var makeTree = function(h,s)
{
    var height = h;
    var season = s;

    tree = {};

    tree.getHeight = function()
    {
        return height;
    }

    tree.getSeason = function()
    {
        return season;
    }

    return tree;
}

正如你所看到的,我正在尝试创建一个类树来创建树对象,但是为了使所有属性都安全,我有一个makeTree函数将树对象返回给我,我只能访问它的属性通过getHeight和getSeason。

重要的是要注意树对象根本不包含字段高度和季节。

所以,说我这样做:

var banyan = makeTree(100,"summer");
var apple = makeTree(50,"winter");

我可以像这样访问两个对象的字段:

banyan.getSeason();
//"summer"
apple.getHeight();
//50

我的问题是这个世界是如何发生的?

所以,我想到了这一点,并猜测也许这就是它的工作方式:当我调用makeTree来制作banyan时,我用参数100调用它,并且makeTree函数返回给我一个具有常量函数getHeight的对象一直打电话给我100。 (没有任何记忆)

但后来我这样做了:

var makeTree = function(h,s)
{
    var height = h;
    var season = s;

    tree = {};

    tree.getHeight = function()
    {
        return height;
    }

    tree.getSeason = function()
    {
        return season;
    }

    tree.changeHeight = function(new_h)  //added this
    {
        height = new_h;
    }

    return tree;
}

瞧!

banyan.changeHeight(60);
banyan.getHeight();
//60!!!!

好的,我的问题非常清楚,因为每个对象根本没有任何字段用于存储值,每个对象的高度和季节都存储在哪里?

之前我已经完成了Python,Java和C,所以如果有人可以在解释时进行比较和对比,那就太棒了!

1 个答案:

答案 0 :(得分:-1)

运行时:

var makeTree = function(h,s)
{
    // ...
}

您创建一个闭包 - 函数体内的所有内容,包括变量定义和函数都被捕获,以后可以访问。在您的情况下,您可以通过getHeightgetSeason函数等访问该闭包的内容。