0

我最近开始尝试在使用它时使用更多的 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 中它似乎更有意义......

谢谢

4

1 回答 1

2

1) 双组圆括号表示什么 var Person =(function(){...})();

这是一个在前面执行的函数。它使函数内部的局部变量不会在全局范围内声明。

例子:

tmp = function() { CODE };
tmp()

...与...基本相同

(function() { CODE })();

您只需要在函数周围添加额外()内容,否则会出现语法错误。

2)为什么变量 nextId 是静态的并且每次创建 Person 对象时都不会重新创建?javascript中是否有某种对象缓存(如加载的类)?

由于 nextId 是在函数范围内创建的(参见 1),因此在从代码访问时它始终是同一个变量。

3) 如果我使用 new Person() 创建 Person 对象,它实际上是一个 cls 对象吗,因为那是函数返回的内容?

该函数(参见 1)返回cls在内部创建的。所以是的,Person并且cls实际上是同一件事。

4)如果我以这种方式创建对象,那么将方法附加到原型是否有任何意义,因为我可以在 cls 对象中声明announce函数,并且所有实例都会有它,不是吗?

不同之处在于原型在所有实例之间共享,而在构造函数中添加它们基本上是一个副本。使用原型更快,内存效率也更高。

5) 在 cls 函数内部,“this”实际上指的是什么?它是在“return cls;”行从该函数本身返回的新创建的对象吗?

不。当你打电话时,new Person()你实际上是在打电话new cls()。New 创建一个新对象并调用this设置为该对象的函数。因此,函数this内部cls是您正在创建的实际对象实例。


顺便一提。如果您真的想使用 JavaScript 进行一些 OOP 编程,我建议您使用来自 JohnResig 的优秀代码片段:http: //ejohn.org/blog/simple-javascript-inheritance/

于 2013-01-30T10:41:10.463 回答