2013-11-08 8 views
1

Это самый простой пример объекта JS, о котором я могу думать, который иллюстрирует мои вопросы.Javascript OOP - объявление методов объекта

Вопрос 1.

Как я могу ссылаться на функцию в классе, так что в другом коде, который я мог бы вызвать метод? Это дает мне ошибку.

var name1 = new Name(); 
    name1.render(); 

Вопрос 2.

чем разница между объявлением функций в линии, как эти против использования var getByID = function() ...?

Пример объекта:

function Name(user_id, container_id) { 
    this.userID = user_id; 
    this.containerID = container_id; 
    this.firstName = null; 
    this.lastName = null; 

    function getByID(userID) { 
    // An ajax call that takes a userID to get a name. 
    } 

    function setName() { 
    // An ajax call to get the name from db. 
    name_record = this.getByID(this.userID); ????? this returns an error that getByID is undefined. 
    this.firstName = name_record.firstName; 
    this.lastName = name_record.lastName; 
    } 

    function render() { 
    $(this.containerID).val(this.firstName + ' ' + this.lastName); 
    } 
} 
+0

Вам нужно передать некоторые параметры в 'Name'. 'container_id'' undefined', поэтому '$ (this.containerID)' не будет работать. –

+0

Связанный: http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript – cmbuckley

+0

Вопрос 2: http://stackoverflow.com/questions/336859/var-functionname-function- vs-function-functionname – orhanhenrik

ответ

2

Вы можете объявить объект, как вы сделали в своем втором вопросе, он действителен, поскольку функция - это объект. Или другие способы, такие как:

var Name = { 
    render: function() { 
    } 
} 

Name.render(); 

Или с prototype:

function Name() { 
} 

Name.prototype.render = function() { 
} 
// or 
Name.prototype = { 
    getByID: function() { 
    }, 
    setName: function() { 
    } 
} 
var n = new Name(); 

Все эти snipets являются действительными декларация объекта.

Ваш второй вопрос может ответить первым. Когда вы объявляете функцию как это:

function Name() { 
    function render() { 
    } 
} 
var n = new Name(); 

Это как render() быть частным методом. если вы вызываете вне имени функции n.render(), вы увидите ошибку, потому что render не распознается. Но если вы измените к этому ...

function Name() { 
    this.render = function() { 
    } 
} 

... тогда n.render() будет работать как render() быть публичным способом. См. this и this для получения дополнительной информации о методах public и private.

Теперь разница между объявление функции «в линию» или установить его в переменной является то, что с этим:

function Name() { 
} 

Вы можете сделать:

var n1 = Name(); 
var n2 = Name(); 
var nn = Name(); // and so on... 

Но с:

var n = function Name() { 
} 

Это n() будет работать, а Name() - нет. Даже var a = Name() выдаст исключение.

Here's a good article об этой теме, которую стоит прочитать. Надеюсь, это поможет.

0

Вопрос 1: А "класс" в JavaScript, это не более, чем объект. Объект имеет свойства, к которым вы можете получить доступ. Эти свойства являются либо переменными, либо функциями, либо другими объектами. Объявляя ваши функции как:

function render() { 
    $(this.containerID).val(this.firstName + ' ' + this.lastName); 
    } 

Вы объявляете функцию в рамках функции Name(), но эта функция не является свойство Name. Это просто частный метод. Есть несколько способов, которыми Вы могли бы сделать его частью Name(), такие как:

function Name(user_id, container_id) { 
    this.userID = user_id; 
    this.containerID = container_id; 
    this.firstName = null; 
    this.lastName = null; 
    this.render = function() { 
    console.log('hello world'); 
    } 
} 

var name1 = new Name(); 
name1.render(); 

Вопрос 2: Там нет никакой разницы. Это просто два разных синтаксиса, которые достигают того же результата. Второй способ (объявление var и определение функции) сразу дает вам ссылку на функцию, но это также можно добиться первым способом.

0

Ответ на первый вопрос:

Функции GetByID, SetName и визуализации являются локальным для конструкторы и не может быть вызван объектом класса. Вы должны использовать прототипное наследование.

например.

function Name(user_id, container_id) { 
this.userID = user_id; 
this.containerID = container_id; 
this.firstName = null; 
this.lastName = null; 
} 

Name.prototype = { 

getByID :function(userID) { 
    // An ajax call that takes a userID to get a name. 
} 

setName:function() { 
    // An ajax call to get the name from db. 
    name_record = this.getByID(this.userID); 
    this.firstName = name_record.firstName; 
    this.lastName = name_record.lastName; 
} 

render:function() { 
    $(this.containerID).val(this.firstName + ' ' + this.lastName); 
} 
}; 

Ответ на ваш второй вопрос:

в случае аЬса(); // Ошибка функции а() {}

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

однако это

abc(); 
var abc = function(){ 
}; 

создан во время разбора, поэтому вы можете вызвать его перед объявлением.

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