Javascript 这种情况是错误的(很可能是错误的)

Javascript 这种情况是错误的(很可能是错误的),javascript,Javascript,我(很可能)对这个的上下文有问题: 我在JS中新的,更像C++的家伙。 请参见代码: controller.js: canvas.js: 功能CCanvas(\u主控制器){ 变量控制器=_主控制器; } CCanvas.prototype.myEvent(){ 这个.controller.resize();//很可能不是范围问题。假设您的\u mainController实际上是一个控制器(我将在即将展示的版本中添加该控制器),您的问题是,在CCanvas的构造函数中,您正在分配var-con

我(很可能)对这个的上下文有问题: 我在JS中新的,更像C++的家伙。 请参见代码:

controller.js:

canvas.js:

功能CCanvas(\u主控制器){
变量控制器=_主控制器;
}
CCanvas.prototype.myEvent(){

这个.controller.resize();//很可能不是范围问题。假设您的
\u mainController
实际上是一个控制器(我将在即将展示的版本中添加该控制器),您的问题是,在
CCanvas
的构造函数中,您正在分配
var-controller
,而不是
this.controller
。这反过来会导致
controller
被删除(毕竟
var
是局部变量的关键字)

function CCanvas(_mainController){
    if (!(_mainController instanceof CController)) throw "Not a controller";
    this.controller = _mainController;
}
这应该是可行的。它可以防止您提供非控制器

如果您真的想坚持注释中的原则,并且让变量不在类中,但仍在词法范围内,请执行以下操作:

var CCanvas = function(_mainController) {
  var outputCCanvas = function(){
  };
  outputCCanvas.prototype.myEvent = function(){
     console.log("Event");
  }
  return outputCCanvas;
};
在这一点上的间接性水平是疯狂的,你会失去很多好东西:

  • 不可能对
    CCanvas
    执行
    instanceof
    检查,因为每次调用该方法时都会动态生成每个实例
  • 哦,是的,您的实例化发生了变化。现在,您正在执行
    new(CCanvas(_mainController))()
    ,因为
    CCanvas
    现在是一个返回类的方法

我很惊讶您有一个工作代码和一个非工作代码,但您看不到模式。提示:
this.controller=/*…*/
但是是否可以不使用'this'前缀声明控制器,这样它就不会是从该函数外部可访问的属性?当然,但是尝试用另一个方法访问它是无效的。为什么uld您不想以在该函数外部使用时无法在该函数外部访问为借口将其声明为对象属性吗?上次我检查时,
myEvent()
不是类的构造函数(=不是函数)。在我的回答中添加了一种方法,以备不时之需。不过,我强烈建议你看看你为此而牺牲的东西。这纯粹是为了突出问题。
function CCanvas(_mainController){
    if (!(_mainController instanceof CController)) throw "Not a controller";
    this.controller = _mainController;
}
var CCanvas = function(_mainController) {
  var outputCCanvas = function(){
  };
  outputCCanvas.prototype.myEvent = function(){
     console.log("Event");
  }
  return outputCCanvas;
};