在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:The Good Parts" - 虽然它有点极端,但我已经接受了很多他要说的话.
在第3章中,他讨论了对象,并且在某一点上列出了一种模式(也在这里找到),用于简化和避免使用内置"new"关键字时出现的一些混淆/问题.
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
newObject = Object.create(oldObject);
Run Code Online (Sandbox Code Playgroud)
所以我尝试在我正在处理的项目中使用它,并且在尝试从嵌套的对象继承时发现了一个问题.如果我覆盖使用此模式继承的嵌套对象的值,它将覆盖原型链上的嵌套元素.
Crockford的例子就像flatObj下面的例子一样,效果很好.但是,该行为与嵌套对象不一致:
var flatObj = {
firstname: "John",
lastname: "Doe",
age: 23
}
var person1 = Object.create(flatObj);
var nestObj = {
sex: "female",
info: {
firstname: "Jane",
lastname: "Dough",
age: 32
}
}
var person2 = Object.create(nestObj);
var nestObj2 = {
sex: "male",
info: { …Run Code Online (Sandbox Code Playgroud)