Объектно-ориентированное программирование (ООП)-это парадигма программирования, а также метод разработки программы. Объект относится к экземпляру класса. Он использует объекты в качестве основной единицы программы, инкапсулирующие программы и данные для улучшения повторного использования, гибкости и масштабируемости программного обеспечения. - Википедия
Как правило, объектно-ориентированные включает в себя: наследование, инкапсуляции, полиморфизм, абстракция
Наследование формы объекта
Легкая копия
var Person = {name: 'allin', возраст: 18, адрес: {Home: 'Home', Office: 'Office',} Sclools: ['x', 'z'],}; var Programer = {jrange: 'js',}; function extend (p, c) {var c = c || {}; for (var prop in p) {c [prop] = p [prop]; }} extend (человек, программа); Programer.name; // allinprogramer.address.home; // HomeProgramer.address.home = 'house'; //houseperson.address.home; // домИз приведенных выше результатов недостаток мелкой копии заключается в том, что изменение значения типа ссылки в детском объекте повлияет на значение в родительском объекте, поскольку в мелкой копии типа ссылки только копирует адрес и указывает на той же копию в памяти.
Глубокая копия
Функция extendeeply (p, c) {var c = c || {}; for (var prop in p) {if (typeof p [prop] === "Object") {c [prop] = (p [prop] .constructor === Array)? []: {}; extendeeply (p [prop], c [prop]); } else {c [prop] = p [prop]; }}}Используйте рекурсию для глубокого копирования, чтобы модификация субъектов не повлияла на родительский объект.
extendeeply (человек, программы); Programer.address.home = 'allin'; person.address.home; // Home использует вызов и применить к наследственной функции parent () {this.name = "abc"; this.address = {Home: "Home"};} function child () {parent.call (this); this.language = "js"; } Object.create () в es5 var p = {name: 'allin'}; var obj = object.create (o); obj.name; // allinObject.Create () В качестве альтернативы новому оператору выпускается только после ES5. Мы также можем имитировать этот метод самостоятельно:
// Симулировать функцию method object.create () mycreate (o) {function f () {}; F.Prototype = O; o = new f (); return o;} var p = {name: 'allin'}; var obj = mycreate (o); obj.name; // allinВ настоящее время последние версии крупных браузеров (включая IE9) развернули этот метод. Если вы столкнетесь с старым браузером, вы можете использовать следующий код для развертывания самостоятельно.
if (! object.create) {object.create = function (o) {function f () {} f.prototype = o; вернуть новый f (); }; }Наследство классов
Object.create () function person (name, age) {} person.prototype.headcount = 1; person.prototype.eat = function () {console.log ('еда ...');} функциональный программист (имя, возраст, заголовок) {} programmer.prototype = objecte (person.prototype); // Создать программист по отношению к наследству.prototype.constructor = Progrommer; // Измените указание конструктораВызовать метод класса родителей
Функция человека (имя, возраст) {this.name = name; this.age = age;} person.prototype.headcount = 1; person.prototype.eat = function () {console.log ('еда ...');} функциональный программист (имя, возраст, заголовок) {person.apply (это, аргументы); // Вызовите конструктор родительского класса} programmer.prototype = object.create (person.prototype); programmer.prototype.constructor = programmer; programmer.prototype.language = "js"; programmer.prototy.work = function () {console.log ('im im in a Work in'+ this.language); Person.prototype.eat.apply (это, аргументы); // Вызовите метод в родительском классе}Упаковка
Пространство имен
У JS нет пространства имен, поэтому его можно смоделировать с помощью объектов.
var app = {}; // APPPACE APP // Модуль 1App.Module1 = {name: 'allin', f: function () {console.log ('hi robot'); }}; app.module1.name; // "allin" app.module1.f (); // Привет, роботСтатические члены
Функция человека (имя) {var age = 100; this.name = name;} // static member.walk = function () {console.log ('static');}; person.walk (); // СтатическийЧастный и общественный
Функция Person (id) {// частные свойства и методы var name = 'allin'; var Work = function () {console.log (this.id); }; // Общественные свойства и методы this.id = id; this.say = function () {console.log ('Say Hello'); work.call (это); };}; var p1 = новый человек (123); p1.name; // undefinedp1.id; // 123p1.say (); // Скажи привет 123Модульный
var modulea; modulea = function () {var prop = 1; function func () {} return {func: func, prop: prop};} (); // немедленно выполнить анонимную функциюОпора, Func не будет просочиться в глобальную масштаб. Или другой способ написания, используйте новый
modulea = new Function () {var prop = 1; функция func () {} this.func = func; this.prop = prop;}Полиморфный
Метод моделирования перезагрузка
Атрибут аргументов может получить количество фактических параметров функционального вызова и может использовать его для моделирования перегрузки метода.
Функция демонстрация (a, b) {console.log (demo.length); // Получить количество формальных параметров console.log (arguments.length); // Получить количество фактических параметров console.log (аргументы [0]); // первый фактический параметр 4 console.log (аргументы [1]); // второй фактический параметр 5} демонстрация (4, 5, 6); // Реализуйте добавление переменной длины фактические параметры функция add () {var otal = 0; for (var i = arguments.length-1; i> = 0; i-) {total += аргументы [i]; } return Total;} console.log (add (1)); // Реализуйте добавление переменной длины фактические параметры функция add () {var otal = 0; for (var i = arguments.length-1; i> = 0; i-) {total += аргументы [i]; } return Total;} console.log (add (1)); // 1 -anconsole.log (добавить (1, 2, 3)); // 7 // В случае разных параметров функция fontsize () {var ele = document.getElementById ('js'); if (arguments.length == 0) {return ele.style.fontsize; } else {ele.style.fontsize = аргументы [0]; }} fontsize (18); console.log (fontsize ()); // В случае различных типов Function function () {var ele = document.getElementById ('JS'); if (typeOf аргументы [0] === "Object") {for (var p в аргументах [0]) {ele.style [p] = аргументы [0] [p]; }} else {ele.style.fontsize = аргументы [0]; ele.style.backgroundcolor = аргументы [1]; }} настройка (18, 'red'); настройка ({fontsize: 20, founalcolor: 'green'});Метод переписывает
function f () {} var f = new f (); f.prototype.run = function () {console.log ('f');} f.run (); // ff.run = function () {console.log ('fff');} f.run (); // fffАннотация класс
бросить новую ошибку (''); В конструкторе бросает исключение. Это предотвращает название этого класса напрямую.
Function DetectorBase () {бросить новую ошибку ('Аннотация класса не может быть вызвано напрямую!');} DetectorBase.prototype.detect = function () {console.log ('начало детектирования ...');}; detectorbase.prototype.stop = function () {консоль. {Throw New Error ('error');}; // var d = new DetectorBase (); // uncauct error: абстрактный класс не может быть вызван непосредственно! Function linkdetector () {} linkdetector.prototype = object.create (detectorbase.prototype); LinkDetector (); console.log (l); // linkdetector {} __ proto__: linkdetectorl.detect (); // Начало обнаружения ... l.init (); // Ошибка непредуденного: ошибка