我想知道以下两个代码段之间的区别

我了解这是静态的,因为无需使用new关键字创建实例,就可以调用getCookie和setCookie函数。

var CookieHandler = function () {};

CookieHandler.getCookie = function (key) {

};

CookieHandler.setCookie = function (key, value) {
};

这是实例。在这种情况下,您需要创建一个实例来调用函数。
var CookieHandler = function () {};

CookieHandler.prototype.getCookie = function (key) {

};

CookieHandler.prototype.setCookie = function (key, value) {
};

我是一名Java程序员,几乎不了解JS概念,请对此提供帮助。

最佳答案

在Javascript中,任何函数也是一个对象,因此任何函数都可以为其分配属性。这就是您的第一段代码正在做的事情。它只是将属性分配给CookieHandler函数。如果将CookieHandler用作对象定义,则尽管不完全相同,但它们类似于其他OO语言中的类静态属性。

如果它不是对象定义,那么CookieHandler就像是Javascript命名空间,而getCookiesetCookie就像该命名空间中的属性。

您的第二个代码块是为原型(prototype)分配属性。这些属性将由实例化的CookieHandler对象继承。

因此,在您的第一段代码中:

var CookieHandler = function () {};
CookieHandler.getCookie = function (key) {
};
CookieHandler.setCookie = function (key, value) {
};

您可以随时随意调用CookieHandler.getCookie()CookieHandler就像一个 namespace 对象,而getCookiesetCookie是 namespace 上的属性。

如果创建一个CookieHandler对象,例如:
var x = new CookieHandler();
x.getCookie();    // does not work
x.setCookie();    // does not work

然后,x将没有getCookie()setCookie()方法。这些方法仅存在于CookieHandler对象上。它们不是由CookieHandler实例继承的。

与您的第二个代码块:
var CookieHandler = function () {};
CookieHandler.prototype.getCookie = function (key) {
};
CookieHandler.prototype.setCookie = function (key, value) {
};

您正在定义CookieHandler实例将继承的属性(实例继承原型(prototype)上的属性)。因此,当您这样做时:
var x = new CookieHandler();
x.getCookie();    // works
x.setCookie();    // works

因此,当您想定义对象实例将继承的属性(通常是方法)时,请使用prototype。如果您不打算定义实例方法,则只需将方法放在第一个代码块中的任何对象上即可。

09-16 09:54