6. Уроки Node.js. Util и Наследование
Всем привет! Тема ближайших статей: Самые часто используемые модули Node.js.
Первым методом, который мы изучим, будет метод util inspect модуля, встроенного util. Этот метод позволят красиво вывести любой объект, даже если у этого объекта, как в этом примере, есть ссылка на самого себя.
1 2 3 4 5 6 7 8 9 | var util = require('util'); var obj = { a: 5, b: 6, }; obj.self = obj; console.log( util.inspect(obj) ); |
Запускаем node inspect.js и видим, что, действительно, все красиво обработалось. При этом, если у объекта есть свойства inspect, и оно равно функции, то эта функция будет вызвана.
1 2 3 4 5 6 7 8 9 10 11 12 | var util = require('util'); var obj = { a: 5, b: 6, inspect: function() { return 123; } }; obj.self = obj; console.log( util.inspect(obj) ); |
Именно ее результат будет возвращен. Например, я сделал функцию inspect и вернулся 123. Таким образом, поведение метода util inspect несколько напоминает toString. И этот метод используется в console автоматически, если она хочет добавить в log какой-то объект. Я убрал util inspect:
1 2 3 4 5 6 7 8 9 10 11 12 | var util = require('util'); var obj = { a: 5, b: 6, inspect: function() { return 123; } }; obj.self = obj; console.log(obj); |
Вызываю. Все работает так же. Потому что, на самом деле, console вызывает его внутри. Однако, иногда все же необходимо обращаться к util inspect явно, в первую очередь, в тех случаях, когда мы хотим вывести что-то не в console, а, например, получить строчное представление объекта для вывода в файл. Кроме того, есть дополнительные параметры util inspect: можно, например, задать глубину вывода объекта, по умолчанию два. Но они используются редко.
Следующая команда – это util format. Создадим файл format.js.
1 2 3 4 | var util = require('util'); var str = util.format("My %s %d %j", "string", 123, {test: "obj"}); console.log(str); |
Util format получает строку и дальше оно подставляет в нее следующие параметры. Вместо %s будет выведена строка, вместо %d будет выведено число, а далее вместо %j будет выведен объект в формате json. Если я сейчас это запущу, то вот что я получу:
{“text”:”obj”}
Обратите внимание, это формат json. Это не вывод util inspect. Соответственно, если вдруг я вместо числа передал здесь что-то еще, то при выводе я получу NaN, потому что автоматически происходит конвертация.
Метод util format также используется в console не явно. Если я сейчас возьму и перенесу это прямо в консоль:
1 2 3 4 | var util = require('util'); var str = util.format("My %s %d", "string", 123, {test: "obj"}); console.log(str); |
то все отлично продолжит работать:
1 2 3 4 | var util = require('util'); console.log("My %s %d", "string", 123, {test: "obj"}); |
Следующий, последний метод util, о котором пойдет речь – это метод util inherits. Чтобы его было легче понять, я позволил себе скачать исходники Node.js и достать из них файл util.js. Это как раз и есть исходник модуля util. И там на чистом java script есть метод inherits:
1 2 3 4 5 6 7 8 9 10 11 | exports.inherits = function(ctor, superCtor); { ctor.super_ = superCtor ctor.prototype = Object.create(superCtor.prototype, { constructor: { value:ctor, enumerable:false, writable:true, configurable:true } }); }; |
Если вы знаете, как работает OOP в JavaScript, тогда вы этот метод сразу понимаете. Если же нет, то рекомендуется разобраться с этим. Впрочем, использовать его одно и так довольно просто. Достаточно создать родительский класс, конструктор, методы в прототипе.
1 2 3 4 5 6 7 8 9 10 | var util = require('util'); // Parent function Animal(name) { this.name = name; } Animal.prototype.walk = function() { console.log("Running " + this.name); }; |
Затем, чтобы унаследовать от него, создаем конструктор потомка и вызываем util inherits:
1 2 3 4 5 6 | // Потомок function Rabbit(name) { this.name = name; } util.inherits(Rabbit, Animal); |
Потом добавляем в прототип методы:
1 2 3 | Rabbit.prototype.jump = function() { console.log("Jumping " + this.name); }; |
Получается, что все объекты, создаваемые этим конструктором, будут наследовать от Animal. Так что если я сейчас запущу код node inherits.js, то rabbit.walk сначала вызовет метод родителя, а rabbit.jump вызовет метод потомка. Все как обычно при наследовании:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | var util = require('util'); // Parents function Animal(name) { this.name = name; } Animal.prototype.walk = function() { console.log("Running " + this.name); }; // Child function Rabbit(name) { this.name = name; } util.inherits(Rabbit, Animal); Rabbit.prototype.jump = function() { console.log("Jumping " + this.name); }; // Usage var rabbit = new Rabbit("rabbit"); rabbit.walk(); rabbit.jump(); |
Код данного урока можно скачать отсюда.
Материал урока взят из следующего скринкаста.
We are looking forward to meeting you on our website soshace.com
Sign in \ Sign Up
Or use email\username to sign in
By Signing In \ Signing Up, you agree to our privacy policy