البرمجة الموجهة للكائنات (OOP) هي نموذج برمجة وأيضًا طريقة لتطوير البرنامج. يشير كائن إلى مثيل للفصل. يستخدم الكائنات كوحدة أساسية للبرنامج ، وتغليف البرامج والبيانات فيه لتحسين قابلية إعادة الاستخدام والمرونة وقابلية التوسع في البرنامج. - ويكيبيديا
بشكل عام ، يشمل الموجهة نحو الكائن: الميراث ، التغليف ، تعدد الأشكال ، التجريد
ميراث شكل الكائن
نسخة خفيفة
var person = {name: 'allin' ، العمر: 18 ، العنوان: {home: 'home' ، Office: 'Office' ،} sclools: ['x' ، 'z'] ،} ؛ var programer = {language: 'js' ،} ؛ وظيفة تمديد (p ، c) {var c = c || {} ؛ لـ (var prop in p) {c [prop] = p [prop] ؛ }} تمديد (شخص ، برنامج) ؛ programer.name ؛ // allinprogramer.address.home ؛ // homeprogramer.address.home = 'house' ؛ //houseperson.address.home ؛ // منزلمن النتائج المذكورة أعلاه ، فإن عيب النسخة الضحلة هو أن تعديل قيمة نوع المرجع في الكائن الطفل سيؤثر على القيمة في الكائن الأصل ، لأنه في النسخة الضحلة من النوع المرجعي ينسخ فقط العنوان ويشير إلى نفس النسخة في الذاكرة.
نسخة عميقة
دالة تمددها (P ، C) {var c = c || {} ؛ لـ (var prop in p) {if (typeof p [prop] === "object") {c [prop] = (p [prop] .constructor === array)؟ []: {} ؛ ExtendDeplely (p [prop] ، c [prop]) ؛ } آخر {c [prop] = p [prop] ؛ }}}استخدم عودية النسخ العميق ، بحيث لن يؤثر تعديل الكائنات الفرعية على الكائن الأصل.
ExtendDeplely (الشخص ، المبرمج) ؛ programer.address.home = 'allin' ؛ person.address.home ؛ // يستخدم Home Call والتطبيق على الوراثة Parent () {this.name = "ABC" ؛ this.address = {home: "home"} ؛} وظيفة child () {parent.call (this) ؛ this.language = "JS" ؛ } object.create () in es5 var p = {name: 'allin'} ؛ var obj = object.create (o) ؛ obj.name ؛ // Allinيتم إصدار Object.create () كبديل للمشغل الجديد فقط بعد ES5. يمكننا أيضًا محاكاة هذه الطريقة بأنفسنا:
) f.prototype = o ؛ o = جديد 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 () وظيفة الشخص (الاسم ، العمر) {} person.prototype.headcount = 1 ؛ person.prototype.eat = function () {console.log ('EATE ...') ؛} وظيفة المبرمج (الاسم ، العمر ، العنوان) {} programmer.prototype = object.create (person.prototype) ؛ // إنشاء مبرمج علاقة ميراث. // قم بتعديل توجيه المنشئاستدعاء طريقة فئة الأصل
وظيفة الشخص (الاسم ، العمر) {this.name = name ؛ هذا. // استدعاء مُنشئ الفئة الأصل} programmer.prototype = object.create (person.prototype) ؛ programmer.prototype.constructor = مبرمج ؛ مبرمج. person.prototype.eat.apply (هذا ، الحجج) ؛ // اتصل بالطريقة على الفئة الأصل}طَرد
مساحة الاسم
JS ليس لديه مساحة اسم ، بحيث يمكن محاكاة مع الكائنات.
var 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 person.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 ؛ دالة 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 (الوسيطات. الطول) ؛ // احصل على عدد المعلمات الفعلية console.log (وسيطات [0]) ؛ // المعلمة الفعلية الأولى 4 console.log (وسيطات [1]) ؛ // المعلمة الفعلية الثانية 5} التجريبي (4 ، 5 ، 6) ؛ // تنفيذ إضافة وظيفة المعلمات الفعلية المتغيرة add () {var total = 0 ؛ لـ (var i = endress.length-1 ؛ i> = 0 ؛ i-) {total += mancepitions [i] ؛ } إرجاع إجمالي ؛} console.log (إضافة (1)) ؛ // تنفيذ إضافة وظيفة المعلمات الفعلية المتغيرة add () {var total = 0 ؛ لـ (var i = endress.length-1 ؛ i> = 0 ؛ i-) {total += mancepitions [i] ؛ } إرجاع إجمالي ؛} console.log (إضافة (1)) ؛ // 1console.log (إضافة (1 ، 2 ، 3)) ؛ // 7 // في حالة دالة المعلمات المختلفة fontsize () {var eLe = document.getElementById ('js') ؛ if (edations.length == 0) {return eLe.Style.FontSize ؛ } آخر {ele.style.fontsize = الوسيطات [0] ؛ }} fontsize (18) ؛ console.log (fontsize ()) ؛ // في حالة إعدادات الوظائف المختلفة () {var eLe = document.getElementById ('js') ؛ if (typeof mations [0] === "Object") {for (var p in mancepitions [0]) {ele.Style [p] = mations [0] [p] ؛ }} else {ele.style.fontSize = mations [0] ؛ ele.style.backgroundColor = الحجج [1] ؛ }} Setting (18 ، 'Red') ؛ Setting ({fontsize: 20 ، backgroundColor: 'Green'}) ؛طريقة إعادة كتابة
الدالة f () {} var f = new f () ؛ f.prototype.run = function () {console.log ('f') ؛} f.run () ؛ // ff.run = function () {console.log ('fff') ؛} f.run () ؛ // fffفئة مجردة
رمي خطأ جديد ('') ؛ في مُنشئ يلقي استثناء. هذا يمنع هذا الفئة من استدعاء مباشرة.
دالة detectorbase () {رمي خطأ جديد ('لا يمكن استدعاء الفئة التجريدية مباشرة!) ؛} detectorbase.prototype.detect = function () {console.log (' start ... ') ؛} ؛ detectorbase.prototype.stop = function () {رمي خطأ جديد ('error') ؛} ؛ // var d = new detectorbase () ؛ // un unctured error: لا يمكن استدعاء الفئة التجريدية مباشرة! function linkDetector () {} linkDetector.prototype = object.create (detectorbase.prototype) ؛ linkDetector.prototype.courtructor = vareTect LinkDetector () ؛ console.log (l) ؛ // linkDetector {} __ proto__: linkDetectorl.Detect () ؛ // الكشف البدء ... l.init () ؛ // خطأ غير معلوم: خطأ