Потому что то, где вы вызываете diagramImage.color
, находится в замыкании / функции, которая передается конструктору Kinetic.Shape
. Эта функция не вызывается / не выполняется конструктором до тех пор, пока новый экземпляр, созданный конструктором, не будет присвоен diagramImage
.
Вот минимальный пример, который может лучше объяснить, что происходит:
var MyObject = function(f){
this.myFunc = f; // f is executed sometime later...
};
MyObject.prototype.execute = function(){
this.myFunc();
};
var myObjInst = new MyObject(function(){
console.log("myObjInst:", myObjInst);
});
myObjInst.execute();
Как заметил Twisol, это можно улучшить, используя вместо этого this
. Например:
(function(){
var MyObject = function(f){
this.myFunc = f; // f is executed sometime later...
};
MyObject.prototype.execute = function(){
this.myFunc();
};
var myObjInst = new MyObject(function(){
console.log("myObjInst:", this);
});
myObjInst.execute();
})();
Однако, как отметил Крис, если это не задокументировано API - нет никакой гарантии, что this
будет ссылаться на Kinetic.Shape
во время обратного вызова - поэтому продолжение использования diagramImage
здесь может быть лучшим из этих двух вариантов .
Короче говоря, я думаю, что это не лучший API / пример / использование JavaScript - и я бы не стал считать это нюансом JavaScript, с которым вам придется иметь дело. Конечно, эти нюансы есть, если они вам нужны, но не обязательно.