2015-03-03 2 views
0

Так что я новичок в javascript (исходя из сильного фона java), и я хотел знать правильный способ определения свойств или переменных в классе или конструкторе.Правильный способ определения свойств в Javascript contructor

function RootNode(sTitle, authName, storyNum){ 
    this.sTitle = sTitle; 
    this.authName = authName; 
    this.storyNum = storyNum; 
    this.creationDate = new Date(); 
} 

или

function RootNode(sTitle, authName, storyNum){ 

    var sTitle = sTitle; 
    var authName = authName; 
    var storyNum = storyNum; 
    var creationDate = new Date(); 
} 
+0

# 1. В # 2 вы создаете локальные переменные. –

+0

В JavaScript нет классов (по крайней мере, пока нет). –

+0

И когда есть, я бы не использовал их. https://www.youtube.com/watch?v=PSGEjv3Tqo0 – m59

ответ

3

Простой ответ: используйте первый один


Более подробный ответ

Первый фрагмент кода устанавливает sTitle, authName, storyNum и creationDate Недвижимость на объекте.

Второй фрагмент создает 4 локальные переменные и устанавливает их значения. Эти переменные недоступны вне функции.

Вы можете использовать локальные переменные и переменные объекта вместе, как это:

function RootNode(sTitle, authName, storyNum) { 
    this.sTitle = sTitle; // you can access this variable when you . into the object 

    var privateVariable = 'You cannot see this variable when you . into the object directly'; 
    this.methodInObject = function() { 
     return privateVariable; // but you can access the variable from the function 
    } 
} 

Примечание: Вы, вероятно, хотите добавить return this; в конце функции конструктора, так что он возвращает объект что вы построили.

UPDATE: Per комментарии, вы не должны return this; как использование new RootNode делает это автоматически


Дополнительная литература (+1 для использования автомагически :)?)

+1

Возврат 'this' не нужен, поскольку' new' делает это уже для вас. – plalx

+0

@plalx спасибо, что указал. Я этого не знал (или, если бы я это узнал, я забыл). Я просвещен. –

+0

Конструктор должен возвращать объект. Если нет оператора return, который делает это, он вернет объект, на который ссылается * this *. Некоторым нравится использовать 'return this' для ясности, хотя есть аргументы не для (например, нет возврата, а если * new * не указан в вызове, функция вернет * undefined * - перерыв на раннем этапе и жесткий). – RobG

0

Вы можете использовать первый стиль, но я лично предпочитаю это: http://www.w3schools.com/js/js_objects.asp

+0

Я думаю, что ОП пытается использовать JS в «псевдоклассической» манере. –

+0

w3schools ... Эти ужасные люди ... – Travis

+0

@jsve, что бы было «псевдоклассической» усадьбой? Исходя из сильного фона в java и c, есть ли другой подход, который я должен давать javascript для просмотра? – crazyCoder

0

Первый путь является правильным.

function RootNode(sTitle, authName, storyNum) { 
    this.sTitle = sTitle; 
    this.authName = authName; 
    this.storyNum = storyNum; 
    this.creationDate = new Date(); 
} 

Однако этот метод не очень похож на класс, более уникальный объект. Определение объекта таким образом больше похоже на класс Java.

function RootNode(sTitle, authName, storyNum) { 
    //your constructor 
    this.sTitle = sTitle; 
    this.authName = authName; 
    this.storyNum = storyNum; 
    this.creationDate = new Date(); 
} 

RootNode.prototype.myMethod = function() { 
    //my code 
} 

Этот шаблон полезен, поскольку он позволяет несколько экземпляров без дублирования памяти для свойств. Кроме того, это необходимо, если вы хотите создать подкласс. Прочтите this, чтобы узнать о свойствах прототипа и конструктора

+0

Зачем 'var RootNode = function' быть лучше, чем декларация прямой функции? Это на самом деле хуже, поскольку конструктор не назван. С вашей предложенной конструкцией 'RootNode.name' вернет пустую строку. – plalx

+0

Это хороший момент. Мое внимание было сосредоточено на прототипе. Я отредактирую его. –

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