我一直在使用Javascript,但更多的是以程序方式而不是面向对象的方式。最近,我刚刚开始以OOP方式学习Javascript。任何人都能说出它们之间的区别:
var foo = {
method1 : function(){
}
}
和
var foo = function(){
method: function(){
}
}
这两者是否相同或是第一个静态类?如果两者都相同,那么我的第二个问题是如何编写方法并静态调用它?
答案 0 :(得分:2)
第一个可以被认为是静态类,例如你可以致电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
)来区分它们与常规对象或变量。
答案 1 :(得分:2)
主要之间的区别在于第二个是不正确的,没有任何意义。如果您运行它,则会看到SyntaxError: Unexpected token (
答案 2 :(得分:2)
在第一种情况下,使用对象文字定义对象。从OOP的角度来看,它是一个单身人士。
var myObject = {
field: value,
method: function() { }
}
另一个在语法上是不正确的。然而,该代码可能想要的类似于构造函数。
var myConstructor = function() {
this.field = value;
this.method = function() {};
}
如果使用myConstructor
关键字调用此new
,
myConstructor
将设置this
设置为引用此新对象,因此field
和method
属性将附加到其中示例:
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的类)本身,并且不需要实例化来访问它们。