لا يدعم Javascipt Syntax "فئة" (فئة) [مدعومة بالفعل من قبل ES6] ، ولكن هناك طرق لمحاكاة الفئات. اليوم سأتحدث بشكل أساسي عن طريقة محاكاة "الفصول" في Javascipt وملخص ومراجعة الميراث في JS.
إن تنفيذ "الفصول" والميراث في JS هو المفتاح والصعوبة. قد يكون لدى العديد من الطلاب بعض الفهم لـ "الفصول" والميراث في JS ، ولكن عندما يحللون بعمق ، يشعرون أنهم غير قادرين على القيام بذلك وهم غامضون.
دعنا نلخص أولاً عدة طرق لتحديد "الفصول" بواسطة JS:
الطريقة 1: طريقة المنشئ
هذه الطريقة هي طريقة كلاسيكية نسبيًا وسنرىها كثيرًا. عند إنشاء مثيل ، استخدم الكلمة الرئيسية الجديدة. يمكن أيضًا تحديد خصائص وطرق الفصل على كائن النموذج الأولي للمُنشئ.
وظيفة الشخص (الاسم ، العمر ، الوظيفة) {this.name = name ؛ this.age = العمر ؛ this.job = Job ؛} person.prototype.sayname = function () {Alert (this.name) ؛} var person1 = new person ("Zhang San" ، "29" ، "Web Frontpage Manager") ؛ var person2 = new person ("li si" ، "22" ، "doctor") ؛ person1.sayname () ؛ // pop "Zhang San" Console.log (person2.name) // الإخراج "Li Si"الطريقة 2: Object.Create () الطريقة
يتم إصدار Method Object.creat () كبديل للمشغل الجديد فقط بعد ES5. باستخدام هذه الطريقة ، فإن "الفئة" هو كائن ، وليس وظيفة.
var mymammal = {name: 'herb the mammal' ، get_name: function () {return this.name ؛ } ، يقول: function () {return this.saying || '' ؛ }} var mycat = object.create (myMammal) ؛ mycat.name = 'henrietta' ؛ mycat.saying = 'meow' ؛ mycat.get_name = function () {console.log (this.says + '' + this.name + this.says) ؛الإخراج:
function () {return this.saying || '' ؛ } henriettafunction () {return this.saying || '' ؛ }حاليًا ، نشرت أحدث إصدارات المتصفحات الرئيسية (بما في ذلك IE9) هذه الطريقة. إذا واجهت متصفحًا قديمًا ، فيمكنك استخدام الكود التالي لنشره بنفسك.
if (! object.create) {object.create = function (o) {function f () {} f.prototype = o ؛ إرجاع جديد f () ؛ } ؛ }الطريقة 3: القانون الحد الأدنى
طَرد
لا تستخدم هذه الطريقة هذا والنموذج الأولي ، والرمز بسيط للغاية للنشر. بادئ ذي بدء ، يستخدم أيضًا كائنًا لمحاكاة "الفئة". في هذه الفئة ، حدد مُنشئًا sterffn () لإنشاء مثيل.
var dog = {sterfn: function () {// بعض التعليمات البرمجية هنا}} ؛بعد ذلك ، في sterffn () ، حدد كائن مثيل واستخدم كائن المثيل هذا كقيمة الإرجاع.
var dog = {streamfn: function () {var dog = {} ؛ dog.name = "dog" ؛ dog.makesound = function () { ALERT ("woofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofw oofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoo ofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwo Ofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoo fwOofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoo fwOofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoof woofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofw oofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwoofwooعند استخدامه ، اتصل بالطريقة streamfn () للحصول على كائن المثيل.
var dog1 = dog.creatfn () ؛ dog1.makesound () ؛ // WOOF
تتمثل ميزة هذا النهج في أنه من السهل فهمها ، ولديه بنية واضحة وأنيقة ، وتتماشى مع بناء "البرمجة الموجهة للكائنات" التقليدية ، بحيث يمكن نشر الميزات التالية بسهولة.
ورث
من المريح للغاية تنفيذ فصل واحد في الفصل التالي. ما عليك سوى استدعاء طريقة sterffn () من الأخير في طريقة streefn (). حدد أولاً فئة حيوانات.
var animal = {streamfn: function () {var animal = {} ؛ Animal.eat = function () {Alert ("Eat Exed") ؛ } ؛ إرجاع الحيوان }} ؛بعد ذلك ، في طريقة sterfn () للكلب ، تسمى طريقة sterfn () الحيوان.
var dog = {sterfn: function () {var dog = animal.creatfn () ؛ dog.name = "dog" ؛ dog.makesound = function () {Alert ("wangwoo") ؛ } ؛ عودة الكلب }} ؛سوف يرث مثيل الكلب الذي تم الحصول عليه بهذه الطريقة فئة الكلب وفئة الحيوانات في نفس الوقت.
var dog1 = dog.creatfn () ؛ dog1.eat () ؛ // تناول وجبة
الخصائص الخاصة والأساليب الخاصة
في طريقة STROPHFN () ، طالما أن الأساليب والخصائص التي لم يتم تعريفها على كائن الكلب خاص.
var dog = {streamfn: function () {var dog = {} ؛ var sound = "woof woof" ؛ dog.makesound = function () {Alert (sound) ؛ } ؛ عودة الكلب }} ؛لا يمكن قراءة الصوت المتغير الداخلي في المثال أعلاه خارجيًا ، ولا يمكن قراءته إلا من خلال الطريقة العامة التي تصنعها () من الكلب.
var dog1 = dog.creatfn () ؛ تنبيه (dog1.sound) ؛ // غير محدد
مشاركة البيانات
في بعض الأحيان ، نحتاج إلى جميع كائنات المثيلات لتكون قادرة على قراءة وكتابة نفس البيانات الداخلية. في هذا الوقت ، فقط تغلف هذه البيانات الداخلية داخل كائن الفئة وخارج طريقة STROPHFN ().
var dog = {sound: "wowangwoo" ، streamfn: function () {var dog = {} ؛ dog.makesound = function () {Alert (dog.sound) ؛ } ؛ dog.Changesound = function (x) {dog.sound = x ؛ } ؛ عودة الكلب }} ؛ثم ، يتم إنشاء كائنات مثيل:
var dog1 = dog.creatfn () ؛ var dog2 = dog.creatfn () ؛ dog1.makesound () ؛ // WOOF
في هذا الوقت ، إذا كان هناك كائن مثيل وتم تعديل البيانات المشتركة ، فسيتأثر كائن المثيل الآخر أيضًا.
Dog2.Changesound ("Wuwuwu") ؛ dog1.makesound () ؛ // wuwuwuwuميراث JS
فيما يتعلق بالميراث ، هناك أيضًا العديد من المعلومات المتاحة للاستفسار على الإنترنت ، لكن العديد من الأصدقاء لا يفهمونها بعمق كافي. عندما يتعلق الأمر بالميراث ، إذا لم تتحقق من المعلومات وفجأة ، فقد لا تتمكن من معرفة السبب. هذا يدل على أن معرفتنا الأساسية ليست صلبة بما فيه الكفاية. غير مفهومة تمامًا. اليوم ، أقف على أساس أسلافي ، ودعونا نراجع هذا الميراث معك.
الطريقتين الأكثر شيوعا للميراث هما كما يلي:
ميراث سلسلة النموذج الأولي
ما هو ميراث سلسلة النموذج الأولي؟ لن أتحدث عن التعريف هنا. في الواقع ، هو استخدام النموذج الأولي لروث المستوى الأصل.
على سبيل المثال:
وظيفة Parent () {this.name = 'mike' ؛} وظيفة child () {this.age = 12 ؛} child.prototype = new parent () ؛ هذا.في المثال أعلاه ، من خلال النموذج الأولي ، تتشكل سلسلة. يرث الطفل الوالد. يرث الأخ الطفل. أخيرًا ، لدى Brother سمات الطفل والوالدين ، وكذلك سماته الخاصة. هذا هو ميراث السلسلة الأصلية.
الميراث الكلاسيكي (مُنشئ الاقتراض)
يستخدم الميراث الكلاسيكي عمومًا الاتصال أو التقدم للاتصال بمنشئ SuperType داخليًا. على سبيل المثال:
وظيفة الوالد (العمر) {this.name = ['mike' ، 'Jack' ، 'Smith'] ؛ هذا.الميراث أعلاه هما أساسية طريقتين للميراث.
بالإضافة إلى ذلك ، هناك بعض طرق الميراث ، دعنا نلقي نظرة!
الجمع بين الميراث
عادةً ما يكون الوراثة الجمعية هي طريقة الميراث المستخدمة في جزء من طريقتي الميراث أعلاه.
كمثال:
وظيفة الوالد (العمر) {this.name = ['mike' ، 'Jack' ، 'Smith'] ؛ هذا. ALERT (TEST.RUN ()) ؛ // Mike ، Jack ، Smith Hread21النموذج الأولي الميراث
إنها كلمة واحدة فقط مختلفة عن ميراث السلسلة الأصلي المذكور أعلاه ، لكنها ليست نفس المحتوى. ما نتحدث عنه عن ميراث النموذج الأولي هو ما تحدثنا عنه في الفئة الأخيرة ، وإنشاء فئة جديدة من خلال comple.create () طريقة. لأن هذه الطريقة غير مدعومة من قبل المتصفحات القديمة. لذلك ، إذا لم نستخدم object.create () ، يمكن أن تكون هناك أيضًا طريقة بديلة ، على النحو التالي:
دالة obj (o) {function f () {} f.prototype = o ؛ إرجاع جديد f () ؛ }هذه الوظيفة تنفذ الطريقة التي ننشئ بها فئة في Object.create ()!
لذلك ، ما يلي هو:
دالة obj (o) {function f () {} f.prototype = o ؛ إرجاع جديد f () ؛ } var box = {name: 'trigkit4' ، arr: ['brother' ، 'sister' ، 'baba'] 'mike' ؛ Alert (b1.name) ؛ // mikealert (b1.arr) ؛ // brother ، sister ، babab1.arr.push ('parent') ؛ alert (b1.arr) ؛ // brother ، sister ، baba ، parentvar b2 = obj (box) ؛ ALERT (b2.name) ؛ // trigkit4alerالميراث الطفيلي
كمثال:
وظيفة creatanother (الأصلي) {var clone = كائن جديد (أصلي) ؛ clone.sayhi = function () {Alert ("hi")} ؛ return clone ؛} var person = {name: "haorooms" ، الأصدقاء: ["HAO123" ، "Zhansan" ، "lisi"]} var otherperson = creatanother (person) ؛ Antherperson.sayhi () ؛ // مرحبامزيج طفيلي
وظيفة errantPrototype (النوع الفرعي ، supertype) {varotype = object.creat (supertype.prototype) ؛ النموذج الأولي. constructor = النوع الفرعي ؛ subtype.prototype = prototype ؛} ؛ function superType (name) {this.name = name ؛ this.colors = ['Red' ، 'Blue' ، 'Green'] ؛} supertype.prototype.sayname = function () {console.log (this.name) ؛} function subtype (name ، ation) {//inheritprototype.call(this ، هذا.الميراث الطبقي هو في الأساس الطرق المذكورة أعلاه. دعنا نتحدث بإيجاز عن فئة الفصل من ES6!
فئة تنفيذ ES6
// تحديد نقطة الفئة {constructor (x ، y) {this.x = x ؛ this.y = y ؛ } toString () {return '('+this.x+'،'+this.y+')' ؛ }} var point = new point (2 ، 3) ؛ point.toString () // (2 ، 3) point.hasownproperty ('x') // truepoint.hasownproperty ('y') // truepoint.hasownproperty ('toString')ميراث الطبقة
يمتد Class Colorpoint Point {Constructor (x ، y ، color) {super (x ، y) ؛ // استدعاء مُنشئ (x ، y) من الفئة الأصل this.color = color ؛ } toString () {return this.color + '' + super.toString () ؛ // استدعاء tostring () من الفئة الأصل}}