以下为方法添加方法的方法之间有什么区别:
// Appending methods to a function using nested functions
var myObj1 = {
myMethod : function() {
console.log('myObj1.myMethod was called');
},
myOtherMethod : function() {
},
myOtherOtherMethod : function() {
}
}
// Appending methods to a function using the dot operator:
var myObj2 = {};
myObj2.myMethod = function(){
console.log('myObj2.myMethod was called');
}
myObj2.myOtherMethod = function(){
}
myObj2.myOtherOtherMethod = function(){
}
myObj1.myMethod(); // myObj1.myMethod was called
myObj2.myMethod(); // myObj2.myMethod was called
两者都做同样的事情。除了不同的语法,一种方法优于另一种方法吗?从我的观点来看,这两种方法都只是将方法(或者你喜欢的功能)添加到一个对象中。
答案 0 :(得分:2)
两者在语义上是相同的。对象文字语法是首选,因为它更清楚你正在做什么,它也为JavaScript引擎提供了优化结果的机会。
答案 1 :(得分:1)
它们完全一样。当您不想覆盖对象上已存在的属性/方法时,您必须使用点/方括号访问器。
答案 2 :(得分:1)
声明对象/功能的两种方式之间没有区别。如果你的意思是“他们不改变”的静态方法,那将会很有效。
它们不是传统意义上的静态方法。每次创建这样的对象时,它在内存中都有自己独特的表示形式。这意味着代替内存中的一个函数,您将为该对象的每个实例提供一个函数(该函数的n个副本)。
为了制作静态方法(在经典的OOP意义上,一个类共享的方法(在JavaScript中没有类,所以使用相同的构造函数/原型的对象)不需要实例),你不能真的这样做。但是如果你希望函数只占用内存中的一个空格,你必须使用Constructor Pattern:
function Foo()
{
//we won't assign any properties here.
}
Foo.prototype.method1 = function(var1, var2){
//don't use `this` here if you want the method to be truly static.
//static methods shouldn't try and access instance members.
};
Foo.prototype.method2 = function(var2, var3){
//whatever goes here
};
// Methods on the prototype are shared by all objects of foo, so we can create a new Foo
var f = new Foo();
foo.method1(1,2); // also works.
答案 3 :(得分:1)
正如其他人所说,没有实际的区别。在对象文字中添加属性是有意义的,您可以在前面了解所有内容并且可以只分配值。在添加方法之前,一次添加一个属性是有意义的,例如:
var obj = {
/* define some stuff here */
};
if ( whatever ) {
obj.fn = function(){/* logic A */}
} else {
obj.fn = function(){/* logic B */}
}
没有正确或错误的方法,在每种情况下使用最适合的方式。可以将两者用于同一个对象。