我想知道以下两个代码段之间的区别
我了解这是静态的,因为无需使用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命名空间,而getCookie
和setCookie
就像该命名空间中的属性。
您的第二个代码块是为原型(prototype)分配属性。这些属性将由实例化的CookieHandler对象继承。
因此,在您的第一段代码中:
var CookieHandler = function () {};
CookieHandler.getCookie = function (key) {
};
CookieHandler.setCookie = function (key, value) {
};
您可以随时随意调用
CookieHandler.getCookie()
。 CookieHandler
就像一个 namespace 对象,而getCookie
和setCookie
是 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
。如果您不打算定义实例方法,则只需将方法放在第一个代码块中的任何对象上即可。