понедельник, 5 июня 2017 г.

Sorax. 21. Конструкторы и классы


var Person, person, anotherPerson, Developer, developer;



// Здесь конструктор принимает имя и присваевает его соотвствующему свойству объекта
Person = function(name) {
this.name = name; // this указывает на новый создаваемый объект
};

Person.prototype.greet = function() {
console.log("Hello, my name is " + this.name);
};

// Конструкторы не отличаются от обычных функций ничем.
// Любую функцию можно вызвать с ключевым словом new.
// Чтобы оличить конструкторы от обычных функций их называют с большой буквы.

person = new Person("Jack"); // получам новый объект
console.log(person.name); // Jack
person.greet(); // Hello, my name is Jack

anotherPerson = new Person("Bruce"); // получам новый объект
console.log(anotherPerson.name); // Bruce
anotherPerson.greet(); // Hello, my name is Bruce

// Каждая функция в JS потенциально является конструктором и также имеет свойство prototype.
// Изначально это пустой объект, но мы можем вешать на него любые свойства и методы и они будут доступны всем экземплярам класса.
console.log(Person.prototype); // Object { greet: Person.prototype.greet(), ещё 1… }


// При помощи instanceof мы можем проверить принадлежность любого объекта к классу.
console.log(anotherPerson instanceof Person); // true
console.log(Person.prototype.isPrototypeOf(anotherPerson)); // аналогичная проверка

/* prototype хранит прототип, от которого будут наследовать свойтва все объекты,
которые буду сздаваться этой функцией при поомщи ключевого слова new
*/

// СОЗДАНИЕ ДОЧЕРНИХ КЛАССОВ
Developer = function(name, skills) {
Person.apply(this, arguments);
this.skills = skills || [];
};



// для наследования лучше использовать метод Object.create
Developer.prototype = Object.create(Person.prototype);
Developer.prototype.constructor = Developer;

developer = new Developer("John", ["ruby", "ror", "python"]);
console.log(developer.name); // John
console.log(developer.skills); // Array [ "ruby", "ror", "python" ]
developer.greet(); // Hello, my name is John

console.log(developer instanceof Developer); // true
console.log(developer instanceof Person); // true

// РОДНЫЕ МЕТОДЫ ОЪЕКТА
// Object стоит на вершине иерахии всех классов на языке JS.
// Практически все объекты наследуют свойства от объекта Object.prototype
console.log(new Object()); // Object {  }

// Для преобразования объекта в строку испоьзуют метод toString
console.log(developer.toString()); // [object Object]
// если мы попытаемся конкатенировать к-л строку с нашим объектом, то интерпритатор вызовает метод toString

// Преобразуем массив в строку
console.log([1, 2, 3].toString()); // 1,2,3

// метод toString у функции возвращают исходный код функции
var func = function(arg) {
return arg + 10;
};
console.log(func.toString()); // function (arg) {return arg + 10; }

// Метод valueof преобразует объект в число
console.log(+developer); // NaN

// АТРИБУТ КЛАСС ОБЪЕКТОВ В JS
console.log({}.toString()); // [object Object]
// Здесь Object - класс объекта

// Напишем функцию, которая будет возвращать класс объекта
var classof = function(object) {
return Object.prototype.toString.call(object).slice(8, -1);
}

console.log(classof("")); // String
console.log(classof([])); // Array
console.log(classof({})); // Object
console.log(classof(function(){})); // Function
console.log(classof(1234)); // Number
console.log(classof(true)); // Boolean
console.log(classof(/\d/)); // RegExp

Комментариев нет:

Отправить комментарий