Вы ищете концепцию constructor
.
Все функции в JavaScript являются объектами и могут использоваться для создания объектов:
function make_person(firstname, lastname, age) {
person = {};
person.firstname = firstname;
person.lastname = lastname;
person.age = age;
return person;
}
make_person("Joe", "Smith", 23);
// {firstname: "Joe", lastname: "Smith", age: 23}
Однако для создания новых объектов определенного типа (то есть, которые наследуют прототип, имеют конструктор и т. Д.), Функция может ссылаться на this
и , если она вызывается с помощьюnew
оператор затем вернет объект со всеми атрибутами, которые определены в this
в функции - this
в таких случаях ссылается на новый объект, который мы создаем.
function make_person_object(firstname, lastname, age) {
this.firstname = firstname;
this.lastname = lastname;
this.age = age;
// Note, we did not include a return statement
}
Ключевое отличие, которое следует отметить между make_person
и make_person_object
, заключается в том, что вызов new make_person()
(в отличие от простого make_person()
) ничего не даст по-другому ... оба будут производить один и тот же объект.Однако, вызов make_person_object()
без оператора new
определит ваши атрибуты this
для текущего объекта this
(обычно window
, если вы работаете в браузере.)
Таким образом:
var Joe = make_person_object("Joe", "Smith", 23);
console.log(Joe); // undefined
console.log(window.firstname) // "Joe" (oops)
var John = new make_person_object("John", "Smith", 45);
console.log(John); // {firstname: "John", lastname: "Smith", age: 45}
Кроме того, как указывает @RobG, этот способ работы создает ссылку на свойство prototype
make_person_object
для каждого «Персона», которого мы создаем.Это позволяет нам добавлять методы и атрибуты к лицам после того, как факт:
// Assuming all that came before
make_person_object.prototype.full_name = "N/A";
make_person_object.prototype.greet = function(){
console.log("Hello! I'm", this.full_name, "Call me", this.firstname);
};
John.full_name // "N/A"
John.full_name = "John Smith";
make_person_object.full_name // Still "N/A"
John.greet(); // "Hello! I'm John Smith Call me John"
Согласно соглашению, функции конструктора, такие как make_person_object
, пишутся с заглавной буквы, в единственном числе и «существительными» (из-за отсутствия лучшего термина) -- таким образом, у нас будет Person
конструктор, а не make_person_object
, который может быть ошибочно принят за обычную функцию.
См. также: