Қасиеті (объектінің аттрибуты)
Қасиеттері — бұл айнымалылар қамтылған класс, объектінің әрбір данасында осы қасиеттерді иеленеді. Конструктор (функциялары) класста қасиеттер белгіленеді, осылайша олар әрбір данасы үшін құрылады. Кілт сөз this, ол ағымдағы обьектіге сілтеме, класс қасиеттерімен жұмыс істеуге мүмкіндік
береді. Класс қасиеттеріне сыртынан қолжетімділігі (оқу және жазу) InstanceName синтаксисімен жүзеге асырылады. Төменде мысал ретінде firstName қасиетіг Person класс үшін экземпляр данасын құру кезінде анықтаймыз:
var Person = function (firstName) { this.firstName = firstName; console.log('Person instantiated');
};
var person1 = new Person('Alice'); var person2 = new Person('Bob');
// Выводит свойство firstName в консоль
console.log('person1 is ' + person1.firstName); // выведет "person1 is
Alice" Bob"
console.log('person2 is ' + person2.firstName); // выведет "person2 is
Әдістер
Әдістер — бұл функциялар (және функция ретінде анықталады), екінші жағынан, сол логика, және қасиеттері жүреді. Шақыру әдісі қасиетке қол жеткізуге ұқсайды, бірақ сіз әдіс атын соңында () қосасыз, мүмкін дәлелдерді.
Әдістерді жариялау үшін, функцияны аталған қасиетімен prototype класстың қасиеттерімен иелененсіз. Содан кейін сіз объекті әдісін сіз мұралаған функцияларын есімімен шақырасыз. Төмендегі мысалда Person класс үшін sayHello()әдісін анықтаймыз және пайдаланамыз.
var Person = function (firstName) { this.firstName = firstName;
};
Person.prototype.sayHello = function() { console.log("Hello, I'm " + this.firstName);
};
var person1 = new Person("Alice"); var person2 = new Person("Bob");
// вызываем метод sayHello() класса Person person1.sayHello(); // выведет "Hello, I'm Alice" person2.sayHello(); // выведет "Hello, I'm Bob"
JavaScript әдістері бұл —функциялардың объектіге байланысты қасиеті ретінде жай объектілері: бұл дегеніміз"мәннен тыс" әдістерді тудырасыз. Келесі мысалды қарастырайық:
var Person = function (firstName) { this.firstName = firstName;
};
Person.prototype.sayHello = function() { console.log("Hello, I'm " + this.firstName);
};
var person1 = new Person("Alice"); var person2 = new Person("Bob");
var helloFunction = person1.sayHello;
// выведет "Hello, I'm Alice" person1.sayHello();
// выведет "Hello, I'm Bob" person2.sayHello();
// выведет "Hello, I'm undefined" (or fails
// with a TypeError in strict mode) helloFunction();
// выведет true
console.log(helloFunction === person1.sayHello);
// выведет true
console.log(helloFunction === Person.prototype.sayHello);
// выведет "Hello, I'm Alice" helloFunction.call(person1);
Мұрагерлік
Мұрагерлік — бұл класс ретінде мамандандырылған нұсқасында бір немесе бірнеше класс құру тәсілі (JavaScript жалғыз мұрагерлікті ғана қолдайды). Мамандандырылған класс, әдетте, ұрпағы деп аталады, ал екіншісі-класс ата-анасы.Төмендегі мысалда Student класс ретінде Person класс мұрагерін анықтаймыз. Одан кейін sayHello()әдісін қосамыз addDoodBye() әдісін қайтадан анықтаймыз.
// Определяем конструктор Person var Person = function(firstName) { this.firstName = firstName;
};
// Добавляем пару методов в Person.prototype Person.prototype.walk = function(){ console.log("I am walking!");
};
Person.prototype.sayHello = function(){ console.log("Hello, I'm " + this.firstName);
};
// Определяем конструктор Student function Student(firstName, subject) {
// Вызываем конструктор родителя, убедившись (используя Function#call)
// что "this" в момент вызова установлен корректно Person.call(this, firstName);
// Инициируем свойства класса Student this.subject = subject;
};
// Создаём объект Student.prototype, который наследуется от Person.prototype.
// Примечание: Рспространённая ошибка здесь, это использование "new Person()", чтобы создать
// Student.prototype. Это неверно по нескольким причинам, не в последнюю очередь
// потому, что нам нечего передать в Person в качестве аргумента "firstName"
// Правильное место для вызова Person показано выше, где мы вызываем
// его в конструкторе Student.
Student.prototype = Object.create(Person.prototype); // Смотрите примечание выше
// Устанавливаем свойство "constructor" для ссылки на класс Student Student.prototype.constructor = Student;
// Заменяем метод "sayHello" Student.prototype.sayHello = function(){
console.log("Hello, I'm " + this.firstName + ". I'm studying "
+ this.subject + ".");
};
// Добавляем метод "sayGoodBye" Student.prototype.sayGoodBye = function(){ console.log("Goodbye!");
};
// Пример использования:
var student1 = new Student("Janet", "Applied Physics"); student1.sayHello(); // "Hello, I'm Janet. I'm studying Applied Physics." student1.walk(); // "I am walking!"
student1.sayGoodBye(); // "Goodbye!"
// Проверяем, что instanceof работает корректно console.log(student1 instanceof Person); // true console.log(student1 instanceof Student); // true
Student.prototype = Object.create(Person.prototype) қатарына қатысты мыналар: Ескі JavaScript-та Object.create жоқ болса, онда полифиллді қолдануға (ретінде белгілі "shim") немесе сол нәтижелерге жеткізетін функциялар сияқты, мыналарды пайдалануға болады:
function createObject(proto) { function ctor() { } ctor.prototype = proto; return new ctor();
}
// Пример использования:
Student.prototype = createObject(Person.prototype);
Инкапсуляция
Жоғарғы мысалда Student класы үшін walk() әдісін іске асыру туралы Person класс білу қажет емес, бірақ ол оны пайдалана алады; Student класс бұл әдісті анық анықтауы тиіс емес, әзірге оны өзгерте алмаймыз. Бұл инкапсуляция деп аталады, соның арқасында әр класс деректерді және әдістері бір блокта жинайды.
Ақпаратты жасырудың таралған ерекшелігі, басқа да бағдарламалау тілдері ретінде жиі жүзеге асырылып жатқан жабық және қорғалған әдістері/қасиеттері. Алайда, JavaScript тек имитирлейтін нәрсе сияқты, бұл объектілі-бағдарланған бағдарламалауға қажетті талап болып табылады.
Абстракция
Абстракция – бұл механизм, мұрагерлік (мамандандыру) немесе композиция көмегімен жұмыс мәселелерінің ағымды фрагментін моделирлеуге мүмкіндік беретін. JavaScript мамандандыру мұрагерлігіне қолжеткізеді, класс данасы композициясы басқа обьектілердің атрибуттар мәндерімен мүмкіндігі болады.
JavaScript Fucntion класс Object класстан (бұл мамандануын көрсетеді) мұраға қалдырылады, ал Function.prototype қасиеті бұл Object класс данасы (бұл композиция көрсетеді).
var foo = function () {};
// выведет "foo is a Function: true"
console.log('foo is a Function: ' + (foo instanceof Function));
// выведет "foo.prototype is an Object: true" console.log('foo.prototype is an Object: ' + (foo.prototype instanceof
Object));
Достарыңызбен бөлісу: |