为什么JavaScript会自动允许我的函数采取额外的参数?

时间:2014-05-01 05:20:42

标签: javascript scope prototypal-inheritance

我不能正确理解JavaScript范围和继承。我明确定义了一个函数来获取1个参数(我知道这是可选的,因为JavaScript如何处理参数)但看起来我需要一个额外的参数来使范围界定工作。这是为什么?

ShapeRenderable.prototype = new Renderable();
function ShapeRenderable()
{
    this._line_join = 'round';
    this._line_cap = 'round';
    .
    .
} 

ShapeRenderable.prototype.setFillColor = function (fill_style)
{
    if (fill_style)
    {
        this._fill_style = fill_style;
        this.initialAlpha = fill_style._alpha;
    }
    else
    {
        this._fill_style = new RGBA(0,0,0,1.0);
    }
};



SelectionCube.prototype = new ShapeRenderable();

function SelectionCube()
{ 
    var self = this; // So we can access public methods and members from within
    // private ones.    

    self._visible = true;         
    self._scale = 1;
    self._stroke_style   = new RGBA(0,0,0,.1); // Lines solid black
    self._line_width = 7.0; // 1

    var platonicRenderable = new PlatonicRenderable(this);
    platonicRenderable.createCube(); 

    // surfaces mostly transparent white
    ShapeRenderable.prototype.setFillColor.call(this, new RGBA(255,255,255,1));
    // Why do I have to pass "this" to get the correct scope during 
    // execution of the above? If "this" isn't passed, it looks like JavaScript 
    // is scoping this for the parent, instead of for the child.
    // 
    // This is the correct behavior. My cube is now white.


}

如果我打电话:

ShapeRenderable.prototype.setFillColor.call(new RGBA(255,255,255,1));

然后我的渲染是黑色的(这是不正确的),它看起来像是._fill_style永远不会为我的SelectionCube正确设置。为什么是这样?是否有一些秘密的JavaScript可选(第一个)参数告诉函数在执行期间使用什么范围?我遇到了上述问题,并且我读到了传递这个以便class reference will still point to the child,但我从未理解为什么。

以下是这两种情况的样子: Broken 破碎 - 未正确更新“此”

Works Works - 正确更新“this”

1 个答案:

答案 0 :(得分:1)

您错误地使用了.callcall的正确语法是

fun.call(thisArg[, arg1[, arg2[, ...]]])

请参阅docs

第一个参数是函数中的“范围”或this对象。后续参数将传递给函数的参数。

但在这种情况下,最好在评论中使用@elclanrs建议。