我想在对象中拥有私有属性。以下代码不起作用:
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
才能使变量可访问(例如在成员函数中)?它不会使变量公开吗?
答案 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
后,new
为Game
,且为Function Object
。此时,可以使用instanceof Game
关键字将变量或函数附加到函数对象。在this
的内部,Function Object
指的是对象,而this
Function Object
的外部指的是窗口。您无法使用this
,因为这不是有效的语法。您没有创建变量,而是在扩展对象。因此,var this.variableName
和var dx
是内存中的两个不同位置,具有不同的值。
我希望能为你澄清一些内容。
以下是演示:http://jsfiddle.net/BCZKG/
JS:
this.dx
答案 2 :(得分:0)
我不确定实际问题是什么,但我看到的一个问题是你没有执行游戏:
ns.Game = Game();
但是要在对象外部访问var,您必须执行this.dx或返回语句,如:
return {
dx: dx,
dy: dy
}
这是你在找什么?