ما النمط الذي تستخدمه لإنشاء "فصل دراسي"؟

StackOverflow https://stackoverflow.com/questions/6499

  •  08-06-2019
  •  | 
  •  

سؤال

هناك عدة طرق للحصول على سلوك يشبه الفصل في جافا سكريبت، ويبدو أن الأكثر شيوعًا يعتمد على النموذج الأولي مثل هذا:

function Vector(x, y, x) {
    this.x = x;
    this.y = y;
    this.z = z;
    return this;
}

Vector.prototype.length = function () { return Math.sqrt(this.x * this.x ... ); }

والنهج القائمة على الإغلاق مماثلة ل

function Vector(x, y, z) {
    this.length = function() { return Math.sqrt(x * x + ...); }
}

لأسباب مختلفة، يكون الأخير أسرع، لكنني رأيت (وأنا أكتب كثيرًا) نسخة النموذج الأولي وكان لدي فضول لمعرفة ما يفعله الآخرون.

هل كانت مفيدة؟

المحلول

يعد تعيين الوظائف للنموذج الأولي أفضل (للطرق العامة) لأن كافة مثيلات الفئة ستشارك نفس النسخة من الطريقة.إذا قمت بتعيين الوظيفة داخل المنشئ كما في المثال الثاني، في كل مرة تقوم فيها بإنشاء مثيل جديد، يقوم المنشئ بإنشاء نسخة جديدة من دالة الطول ويقوم بتعيينها لتلك النسخة الواحدة فقط.

لكن هذه التقنية الأخيرة مفيدة إذا كنت يريد يجب أن يكون لكل نسخة نسختها الخاصة، والاستخدام الرئيسي لذلك هو القيام بأساليب خاصة/امتيازات لها حق الوصول إلى المتغيرات الخاصة المعلنة داخل المنشئ والموروثة عبر آلية الإغلاق.

دوجلاس كروكفورد لديه جيد ملخص.

نصائح أخرى

هناك أيضًا النهج الحرفي للكائن في النموذج الأولي:

var Vector = function(){};

Vector.prototype = {
  init:function(x,y,z) {
    this.x = x;
    this.y = y;
    this.z = z;
  },
  length:function() {
    return Math.sqrt(x * x + ...);
  }
};

var v1 = new Vector();
v1.init(1,2,3);

لحسن الحظ أنني حصلت على استخدام prototype.js, ، والذي يوفر بعض الأغلفة الرائعة.لذلك يمكنك القيام بذلك:

var Person = Class.create({
    initialize: function(name) {
        this.name = name;
    },
    say: function(message) {
        return this.name + ': ' + message;
    }
});

Prototype.js توثيق:تحديد الطبقات والميراث

حسنًا، ليس لدي حقًا رأي خبير في هذا الشأن.عادةً ما ينتهي بي الأمر باستخدام النهج القائم على عمليات الإغلاق فقط لأنه يبقي الكود أسهل في الإدارة.لكنني وجدت نفسي أستخدم نماذج أولية للطرق التي تحتوي على الكثير من أسطر التعليمات البرمجية.

لديك أيضًا خيار:

function Vector(x, y, z) {
  function length() {
    return Math.sqrt(x * x + ...);
  }
}

والذي ربما يكون بطيئًا تمامًا مثل المثال الثاني، ولكنه يبدو أشبه بـ Java/C# وأكثر وضوحًا بعض الشيء.

أنا معجب كبير باستخدام مكتبة جون ريسيج لهذا.خفيف الوزن، ومباشر، وأنت تعرف بالفعل كيفية استخدامه إذا كنت معتادًا على النمط "المعتاد" الموجه للكائنات.

لا توجد فئات في جافا سكريبت.

ولكن هناك كائنات.لا تحتاج إلى فئة لإنشاء كائن في جافا سكريبت.لديها وظائف مُنشئة يمكنك استدعاؤها باستخدام الجديد على سبيل المثال:

var james = new Person();

يمكنك محاكاة الفصل مثل السلوك باستخدام:

مثال النموذج الأولي:

function Car (type) {
    this.type = type;
    this.color = "red";
}

Car.prototype.getInfo = function() {
    return this.color + ' ' + this.type + ' car';
};

كائن المثال الحرفي

var car = {
    type: "honda",
    color: "red",
    getInfo: function () {
        return this.color + ' ' + this.type + ' car';
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top