在C++中,我最熟悉的语言,通常是一个声明这样的对象:
class foo
{
public:
int bar;
int getBar() { return bar; }
}
Run Code Online (Sandbox Code Playgroud)
调用getBar()工作正常(忽略bar可能未初始化的事实).内部的变量bar在getBar()类的范围内foo,所以我不需要说,this->bar除非我真的需要说清楚我指的是' bar而不是比如参数.
现在,我正试图在Javascript中开始使用OOP.所以,我查找如何定义类并尝试相同的事情:
function foo()
{
this.bar = 0;
this.getBar = function() { return bar; }
}
Run Code Online (Sandbox Code Playgroud)
它给了我bar is undefined.更改bar以this.bar解决问题,但为每个变量执行此操作会使我的代码变得非常混乱.这对每个变量都是必要的吗?由于我找不到与此有关的任何问题,这让我觉得我做的事情从根本上是错误的.
编辑:是的,所以,从评论我得到的是,this.bar一个对象的属性,引用不同于bar局部变量的东西.有人可以说,为什么这就是范围和对象,以及是否有另一种方法来定义一个没有必要的对象?
我想我误解了Javascript原型继承是如何工作的.具体来说,原型内部变量似乎在多个不同的子对象之间共享.用代码说明最容易:
var A = function()
{
var internal = 0;
this.increment = function()
{
return ++internal;
};
};
var B = function() {};
// inherit from A
B.prototype = new A;
x = new B;
y = new B;
$('#hello').text(x.increment() + " - " + y.increment());?
Run Code Online (Sandbox Code Playgroud)
这输出1 - 2(在JSBin上测试),而我完全期望结果1 - 1,因为我想要两个单独的对象.
如何确保A对象不是多个实例之间的共享对象B?
更新:本文重点介绍了一些问题:
问题是每个方法用于创建一个工作正常的私有变量的范围,也就是操作中的闭包,如果您更改一个对象实例的私有变量,它将被更改为all.即它更像是私有静态属性,而不是实际的私有变量.
所以,如果你想拥有私有的东西,更像是非公共常量,上述任何一种方法都是好的,但不适用于实际的私有变量.私有变量仅适用于JavaScript中的单例对象.
解决方案:根据BGerrissen的回答,更改B原型的声明和离开按预期工作:
var B = function() { A.apply(this, arguments); };
Run Code Online (Sandbox Code Playgroud) 我正在使用EaselJS创建一个游戏,我想知道是否有人可以解释演示文件中使用的继承模式是如何工作的.具体来说,我正在查看以下文件:https://github.com/CreateJS/EaselJS/blob/master/examples/assets/Ship.js
在第7行,船的原型设定为的一个实例createjs.container()...
var p = Ship.prototype = new createjs.Container();
Run Code Online (Sandbox Code Playgroud)
然后在第28行,存储对原始构造函数的引用:
p.Container_initialize = p.initialize; //unique to avoid overiding base class
Run Code Online (Sandbox Code Playgroud)
最后,Ship在第30行初始化对象
p.initialize = function () {
this.Container_initialize();
Run Code Online (Sandbox Code Playgroud)
我试图围绕这种模式,因为它不同于我过去遇到的任何事情.有人可以向我解释为什么你会想要使用类的实例作为新类的原型?也许只是指向一个链接,解释这种模式?非常感谢任何帮助...我意识到这个问题有点模糊.