2012-04-30 2 views
0

В чем разница между ниже подходит для добавления методов к объекту:JavaScript: Добавление статических методов объектов двумя различными способами

// 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 

Оба делают то же самое. Помимо другого синтаксиса, один подход предпочтительнее другого? С моей точки зрения, оба подхода просто добавляют к объекту методы (или функции, если хотите).

http://jsfiddle.net/NK35z/

+0

Вы также можете сделать 'myObj2 [" myOtherOtherOtherMethod "] = function() {};' – LandonSchropp

ответ

2

Эти два семантически идентичны. Синтаксис объектного литерала предпочтительнее, поскольку он более понятен, что вы делаете, а также дает механизму JavaScript возможность оптимизировать результат.

+0

Отлично! Спасибо за все ваши комментарии. Это определенно прояснило некоторые вещи для меня. – ChrisRich

1

Они точно такие же. Вам нужно будет использовать точечный/квадратный скобки, когда вы не хотите переписывать свойства/методы, которые уже существуют на объекте.

+0

Как использование метода точечного доступа предотвращает переписывание текущих значений именованных свойств? – RobG

+0

@RobG, когда он используется вместо назначения нового объекта. Плохой выбор слов? –

1

Нет никакой разницы между обоими способами объявления объектов/функций. Если вы имеете в виду статические методы, как в «они не меняются», это будет отлично работать.

Они не являются статическими методами в традиционном смысле. Каждый раз, когда вы создаете такой объект, у него будет свое собственное уникальное представление в памяти. Это означает, что вместо одной функции в памяти у вас будет одна функция для каждого экземпляра этого объекта (n копий функции).

Чтобы сделать статические методы (в классическом смысле ООП, методы, разделяемые классом (в 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. 
+1

У JavaScript нет классов. Он использует прототипическое наследование. Там действительно ничего, что имитирует статический метод. +1, хотя для шаблона конструктора. – LandonSchropp

+0

@helixed Это правда, и я отредактирую соответственно. Дело в том, что дополнительная память не используется. –

+0

Я имею в виду, что никаких статических методов вообще нет. Прототипическое наследование означает, что объекты наследуются от других объектов. Все объекты уже «экземпляры» в JS. Я знаю, что это каламбур, но вы на самом деле не создаете статические методы. Вы создаете регулярные методы, которые используют прототипическое наследование. – LandonSchropp

1

Как уже сказал, что нет практической разницы. Добавление свойств в объектный литерал имеет смысл, когда вы знаете все впереди и можете просто присваивать значения. Добавление свойств по одному времени имеет смысл, когда вам нужно, чтобы какой-то работы, прежде чем добавить метод, например .:

var obj = { 
    /* define some stuff here */ 
}; 

if (whatever) { 
    obj.fn = function(){/* logic A */} 
} else { 
    obj.fn = function(){/* logic B */} 
} 

Там нет правильного или неправильного способа, используйте все, что лучше всего подходит в каждом конкретном случае. Можно использовать оба объекта для одного и того же объекта.

Смежные вопросы