我最近开始尝试在使用它时使用更多的 javascript 和稍微更面向对象的编程风格。我正在努力掌握一些可能非常基本的概念,所以我想知道是否有人可以帮助我。
下面是我从 Stack Overflow 中提取的一段代码,我将其用作示例:
var Person = (function () {
// private static
var nextId = 1;
// constructor
var cls = function () {
// private
var id = nextId++;
var name = 'Unknown';
// public (this instance only)
this.get_id = function () { return id; };
this.get_name = function () { return name; };
this.set_name = function (value) {
if (typeof value != 'string')
throw 'Name must be a string';
if (value.length < 2 || value.length > 20)
throw 'Name must be 2-20 characters long.';
name = value;
};
};
// public static
cls.get_nextId = function () {
return nextId;
};
// public (shared across instances)
cls.prototype = {
announce: function () {
alert('My id is ' + this.get_id() + ' and my name is "' + this.get_name() + '"\r\n' +
'The next id will be ' + Person.get_nextId());
}
};
return cls;
})();
我有几个问题都与这段代码有关:
1) 双组圆括号表示什么 var Person =(function(){...})();
2)变量 nextId 是静态的,并且每次创建 Person 对象时都不会重新创建?javascript中是否有某种对象缓存(如加载的类)?
3) 如果我使用 new Person() 创建 Person 对象,它实际上是一个 cls 对象吗,因为那是函数返回的内容?
4)如果我以这种方式创建对象,那么将方法附加到原型是否有任何意义,因为我可以在 cls 对象中声明announce函数,并且所有实例都会有它,不是吗?
5) 在 cls 函数内部,“this”实际上指的是什么?它是在“return cls;”行从该函数本身返回的新创建的对象吗?
这些问题很基础,但是 javascript 中的 OO 真的让我很困惑!我通常以面向对象的风格进行编程,但在 java 中它似乎更有意义......
谢谢