Создание собственных объектов с помощью функций конструктора
В JScript предусмотрена удобная возможность определения функций конструктора для создания пользовательских объектов на базе прототипов, которые можно использовать в скриптах. Для создания экземпляра объекта на базе прототипа необходимо сначала определить функцию конструктора. Этот процесс состоит из создания нового объекта и его инициализации (создания свойств и присвоениям им начальных значений). После завершения работы конструктор возвращает ссылку на созданный объект. Внутри конструктора ссылка на объект осуществляется с помощью оператора this.
Конструкторы со свойствами
В следующем примере определяется функция конструктора для объектов pasta. Оператор this позволяет конструктору инициализировать объект.
// pasta is a constructor that takes four parameters.
function pasta(grain, width, shape, hasEgg) {
this.grain = grain; // What grain is it made of?
this.width = width; // How many centimeters wide is it?
this.shape = shape; // What is the cross-section?
this.hasEgg = hasEgg; // Does it have egg yolk as a binder?
}
После определения конструктора объекта экземпляры объекта создаются с помощью оператора new. В данном примере конструктор pasta используется для создания объектов spaghetti и linguine.
var spaghetti = new pasta("wheat", 0.2, "circle", true);
var linguine = new pasta("wheat", 0.3, "oval", true);
Можно динамически добавлять свойства к экземпляру объекта, однако эти изменения относятся только к данному экземпляру.
// Additional properties for spaghetti. The properties are not added
// to any other pasta objects.
spaghetti.color = "pale straw";
spaghetti.drycook = 7;
spaghetti.freshcook = 0.5;
Если необходимо добавить дополнительное свойство ко всем экземплярам объекта, не изменяя функцию конструктора, можно добавить свойство к объекту-прототипу конструктора. Дополнительные сведения см. в разделе Расширенное создание объектов (Visual Studio — JScript).
// Additional property for all pasta objects.
pasta.prototype.foodgroup = "carbohydrates";
Конструкторы с методами
В определение объекта можно включать методы (функции). Один из способов добавления метода состоит во включении в конструктор свойства, которое ссылается на функцию, определенную в другом месте. Подобно функциям конструктора, эти функции также ссылаются на текущий объект с помощью оператора this.
В следующем примере расширяется определенная выше функция конструктора pasta, чтобы включить в нее метод toString, который будет вызываться, если функция отображает значение объекта. (Если объект используется в ситуации, когда требуется строка, в JScript, как правило, используется метод toString самого объекта. Потребность в явном вызове метода toString возникает крайне редко.)
// pasta is a constructor that takes four parameters.
// The properties are the same as above.
function pasta(grain, width, shape, hasEgg) {
this.grain = grain; // What grain is it made of?
this.width = width; // How many centimeters wide is it?
this.shape = shape; // What is the cross-section?
this.hasEgg = hasEgg; // Does it have egg yolk as a binder?
// Add the toString method (defined below).
// Note that the function name is not followed with parentheses;
// this is a reference to the function itself, not a function call.
this.toString = pastaToString;
}
// The function to display the contents of a pasta object.
function pastaToString() {
return "Grain: " + this.grain + "\n" +
"Width: " + this.width + " cm\n" +
"Shape: " + this.shape + "\n" +
"Egg?: " + Boolean(this.hasEgg);
}
var spaghetti = new pasta("wheat", 0.2, "circle", true);
// Call the method explicitly.
print(spaghetti.toString());
// The print statement takes a string as input, so it
// uses the toString() method to display the properties
// of the spaghetti object.
print(spaghetti);
При выполнении этого кода выводится следующий результат.
Grain: wheat
Width: 0.2 cm
Shape: circle
Egg?: true
Grain: wheat
Width: 0.2 cm
Shape: circle
Egg?: true