我一直在使用 Javascript,但更多的是程序方式而不是面向对象的方式。最近,我刚刚开始以 OOP 方式学习 Javascript。任何人都可以告诉有什么区别:
var foo = {
method1 : function(){
}
}
和
var foo = function(){
method: function(){
}
}
这两个是相同的还是第一个静态类?如果两者相同,那么我的第二个问题是如何编写方法并静态调用它?
我一直在使用 Javascript,但更多的是程序方式而不是面向对象的方式。最近,我刚刚开始以 OOP 方式学习 Javascript。任何人都可以告诉有什么区别:
var foo = {
method1 : function(){
}
}
和
var foo = function(){
method: function(){
}
}
这两个是相同的还是第一个静态类?如果两者相同,那么我的第二个问题是如何编写方法并静态调用它?
第一个可以被认为是一个静态类,例如你可以调用foo.method1()
.
第二个是完全错误的,会导致语法错误。
编写静态类以供重用的一种方法是使用module pattern
:
var Foo = (function() {
var private_variable = 1;
function private_function() {
return private_variable + 5;
}
return {
get_private_variable: function() { return private_variable; },
run_private_function: function() { return private_function(); }
}
}());
Foo.get_private_variable(); // returns 1
Foo.get_private_function(); // returns 6
顺便说一句,像上面这样的静态类通常以标题大小写(Foo
而不是foo
)来编写,以将它们与常规对象或变量区分开来。
它们之间的主要区别在于第二个是不正确的并且没有意义。如果你运行它,你会看到SyntaxError: Unexpected token (
在第一种情况下,您使用对象字面量定义对象。从 OOP 的角度来看,它是一个单例。
var myObject = {
field: value,
method: function() { }
}
另一个在语法上不正确。然而,该代码可能想要类似于的是构造函数。
var myConstructor = function() {
this.field = value;
this.method = function() {};
}
如果使用关键字myConstructor
调用它,new
myConstructor
将使用this
set 运行以引用这个新对象,因此field
andmethod
属性将被附加到它上面例子:
var myObject = new myConstructor();
构造的每个新对象实例都myConstructor()
将收到它自己的函数副本method
。这种方式prototype
通常用于存储函数,但这超出了这个问题的范围。
至于静态方法,一种可能是将其直接添加到构造函数中。这是可能的,因为函数在 JS 中也是对象。想象一下这个例子。
var myConstructor = function() {
// keep track of this instance
myConstructor.addInstance(this);
}
myConstructor.instances = new Array();
myConstructor.addInstance = function(obj) {
myConstructor.instances.push(obj);
}
myConstructor.getInstances = function() {
return myConstructor.instances;
}
var myObject1 = new myConstructor();
var myObject2 = new myConstructor();
alert(myConstructor.getInstances()); // [object Object],[object Object]
在这种情况下,构造函数包含一个包含所有现有实例和操作它的方法的数组。这些字段和方法可以被认为是 的静态属性myConstructor
,因为它们包含在构造函数(替代经典 OOP 的类)本身中,并且不需要实例化来访问它们。