这个模块代码中有什么问题?

时间:2013-01-29 21:49:48

标签: javascript module-pattern

我想在对象中拥有私有属性。以下代码不起作用:

var GameModule = (function(ns){

    function Game(ctx) {
        var self   = this, //use self in callback methods (requestAnimationFrame etc)
            ctx    = ctx,

        var dx = 1,
            dy = 1;

        console.log(dx, dy); //writes 1,1,

        console.log(self.dx, self.dy); //writes undefined, undefined
    }

    ns.Game = Game;
    return ns;

})(GameModule || {});

//somewhere later in a different file
$(document).ready(function(){
   var game = new GameModule.Game(some_ctx);
});

似乎vars类似于静态成员,而不是私有成员。

我是否必须编写this.dx = 1才能使变量可访问(例如在成员函数中)?它不会使变量公开吗?

3 个答案:

答案 0 :(得分:1)

要在Javascript中定义类属性,可以这样做(Fiddle):

var Class = function(){

    this.property = 'now this is a property';

    Class.staticProperty = 'and this is a static property';

    var property = 'this is NOT a property, but a local variable';
};

Class.prototype.propertyToo = 'this is also a property';

var object = new Class();

console.log(object.property);
console.log(object.propertyToo);
console.log(Class.staticProperty);

语言本身的JavaScript没有提供任何访问修饰符,因此如果没有tricky methods,私有属性就无法完成。

答案 1 :(得分:1)

您创建的模块中存在多个错误。首先,dx是使用var dx定义的私有变量。它可以在函数内部访问,但不能在外部访问,除非通过返回语句公开,这将使其公开。

然而,我认为你错过了一个关键的区别。有两种类型的功能。可以调用的函数,例如function func(){}函数对象,即向函数发出new关键字,使其成为函数对象,例如{ {1}},或在您的示例中new func();

使用new GameModule.Game(some_ctx);关键字实例Game后,newGame,且为Function Object。此时,可以使用instanceof Game关键字将变量或函数附加到函数对象。在this的内部,Function Object指的是对象,而this Function Object的外部指的是窗口。您无法使用this,因为这不是有效的语法。您没有创建变量,而是在扩展对象。因此,var this.variableNamevar dx是内存中的两个不同位置,具有不同的值。

我希望能为你澄清一些内容。

以下是演示:http://jsfiddle.net/BCZKG/

JS:

this.dx

答案 2 :(得分:0)

我不确定实际问题是什么,但我看到的一个问题是你没有执行游戏:

ns.Game = Game();

但是要在对象外部访问var,您必须执行this.dx或返回语句,如:

return {
  dx: dx,
  dy: dy
}

这是你在找什么?