我不能正确理解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,但我从未理解为什么。
以下是这两种情况的样子: 破碎 - 未正确更新“此”
Works - 正确更新“this”
答案 0 :(得分:1)
您错误地使用了.call
。 call
的正确语法是
fun.call(thisArg[, arg1[, arg2[, ...]]])
请参阅docs。
第一个参数是函数中的“范围”或this
对象。后续参数将传递给函数的参数。
但在这种情况下,最好在评论中使用@elclanrs建议。