it-swarm.asia

وجوه مقابل الطبقة مقابل وظيفة

كنت أتساءل - ما الفرق بين كائنات JavaScript وفئاتها ووظائفها؟ هل أنا محق في التفكير في أن الطبقات والوظائف أنواع من الكائنات؟

وما الذي يميز الفصل عن الوظيفة؟ أم أنها حقا نفس الشيء ، مجرد تغيير المصطلح بالنسبة لهم وفقا لكيفية استخدامها؟

function func() { alert('foo'); } // a function
func(); // call the function - alerts 'foo'
var func2 = function () { alert('hello'); } // acts the same way as 'func' surely?
func2(); // alerts 'hello'

var Class = function() { alert('bar'); }; // a class
var c = new Class(); // an istance of a class - alerts 'bar'

من المؤكد أن الفئات لها طرق وخصائص ويمكن إنشاء مثيل لها - ولكن بعد ذلك ، يمكنني أن أفعل نفس الشيء مع أي وظيفة قديمة - أم لا؟

52
Sean Bone

كما يجب أن تكون على دراية حتى الآن ، لا توجد فصول في JavaScript. بدلاً من ذلك ، قد يتم إجراء وظائف في JavaScript لتعمل كالمنشئين قبل استدعاء دالة باستخدام الكلمة الأساسية new. هذا هو المعروف باسم نمط البناء .

في JavaScript ، كل شيء كائن باستثناء أنواع البيانات البدائية (منطقية ورقم وسلسلة) و undefined. من ناحية أخرى ، null هو في الواقع مرجع كائن حتى لو كنت تعتقد في البداية بخلاف ذلك. هذا هو السبب في إرجاع typeof null"object".

تتشابه الوظائف في JavaScript مع functable في Lua (بمعنى أنها كائنات قابلة للاستدعاء). وبالتالي يمكن استخدام وظيفة في مكان كائن. وبالمثل ، تعد المصفوفات أيضًا كائنات في JavaScript. من ناحية أخرى ، يمكن اعتبار الكائنات صفائف ترابطية.

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

اقرأ الخيط التالي لمعرفة المزيد عن الوراثة النموذجية في JavaScript: فوائد الوراثة النموذجية على الكلاسيكية؟

47
Aadit M Shah

تحديث 2015

هناك فصول في جافا سكريبت لا تستخدمها إلا في المتصفحات القديمة.  enter image description here 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

لديها بناة ، وسروال ، وما شابه ذلك.

class Cat { 
  constructor(name) {
    this.name = name;
  }

  speak() {
    console.log(this.name + ' makes a noise.');
  }
}

class Lion extends Cat {
  speak() {
    super.speak();
    console.log(this.name + ' roars.');
  }
}
30
Neoaptt

فئة في JS:

function Animal(){  

    // Private property
    var alive=true;

    // Private method
    function fight(){ //... }   

    // Public method which can access private variables
    this.isAlive = function() { return alive; } 

    // Public property
    this.name = "Joe";
}

// Public method
Animal.prototype.play = function() { alert("Bow wow!"); }

// .. and so on

الآن عند إنشاء كائن

var obj = new Animal();

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


استرجع سؤالك أيضًا ، سأعيد كتابته كـ:

Class  : A representation of a set with common properties.
object : One from the set with the same properties.


var Class = function() {alert('bar');}; // A set of function which alert 'bar'
var object = new Class();               // One of the functions who alert's 'bar'.
14
loxxy

لا تحتوي JavaScript على فئات ، والوظائف هي في الواقع كائنات في JavaScript (مواطنين من الدرجة الأولى). الاختلاف الوحيد بين الكائنات الوظيفية هو أنها قابلة للاتصال .

function func() { alert('foo'); } // a function - صحيح

func(); // call the function - alerts 'foo' - صحيح

var func2 = function () { alert('foo'); } // same as 'func' surely? - كلا ، func2 هو كائن مختلف ، ويبدو أنه يفعل نفس الشيء عند الاتصال به.

var Class = function() { alert('bar'); }; - إنها وظيفة بدون اسم مخزّن في المتغير Class.

var c = new Class(); - وظيفة المكالمات المخزنة في Class تزود كائنًا فارغًا جديدًا باسم this وتعيد ذلك الكائن. من المتوقع أن تعمل الدالات التي تسمى new functionA() كمنشئات وتحضير كائن تم إنشاؤه حديثًا (this). في حالتك - لا يقوم المنشئ بأي شيء مع الكائن ويقوم فقط بتنبيه bar.

7
mishik

لا توجد فصول في جافا سكريبت. ولكن ، هناك طرق لجعل وظيفة تتصرف مثل الفصل في لغات أخرى.

ويرد شرح جيد للغاية هنا 3 طريقة لتحديد فئة في شبيبة

أيضًا ، تم العثور على مرجع جيد جدًا لـ OOP في Javascript

3
Tala

الكائن هو النوع الأساسي في جافا سكريبت ، أي جميع أنواع البيانات المعرفة من قبل المستخدم يرثها الكائن بطريقة أو بأخرى. لذلك إذا قمت بتعريف دالة أو فئة [ملاحظة حتى الآن لا تدعم JS إنشاء الفئة ، ولكن المقترح في إصدار ECMAScript 6] ، فسوف ترث ضمنياً من نوع الكائن.

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

نظرًا لأن JS لا يدعم إنشاء الفصل في الوقت الحالي ، يمكن أن تعمل الوظائف حقًا كطريقة فردية وكذلك حاوية للوظائف أو الأنواع الأخرى.

آمل مع ECMAScript 6 أن يكون لدينا فصل واضح بين هذه التركيبات على غرار ما لدينا في لغات أخرى مثل C # و Java إلخ.

2
Prasad Honrao

يمكنك أيضًا الحصول على دروس في ES6 تبدو كما يلي:

//class
class Cat {
    //constructor
    constructor() {
        this.name = 'Snowball';
    }

    //method
    meow() {
        console.log('Hello, nyah! My name is ' + this.name + ' nyah!~');
    }
};
1
ShanaSkydancer