Create Object with new Keyword

✅ أولًا: ما معنى new في JavaScript؟

عند استخدام الكلمة المفتاحية new، فإنك:

  1. تنشئ كائنًا فارغًا جديدًا.
  2. تربطه بدالة منشئة (Constructor Function).
  3. تضبط this داخل تلك الدالة ليشير إلى الكائن الجديد.
  4. تُعيد الكائن تلقائيًا ما لم تُرجع شيئًا آخر يدويًا.
🔧 الصيغة العامة:
function ConstructorFunction() {
  this.property = "value";
}

const obj = new ConstructorFunction();
JavaScript
📌 مثال عملي:
function Person(name, age) {
  this.name = name;
  this.age = age;
  this.sayHello = function() {
    console.log("Hello, my name is " + this.name);
  };
}

const person1 = new Person("Ali", 25);
const person2 = new Person("Sara", 30);

console.log(person1.name); // "Ali"
person2.sayHello();        // "Hello, my name is Sara"
JavaScript
✅ ما الذي حدث عند استخدام new Person(...)؟
  1. تم إنشاء كائن جديد فارغ: {}.
  2. تم ربط this داخل الدالة Person بهذا الكائن.
  3. أضفنا خصائص: name, age, sayHello لهذا الكائن.
  4. تمت إعادة الكائن الجديد وربطه بالمتغير person1.
✅ فوائد استخدام new مع الدوال المنشئة:
الفائدةالشرح
إعادة الاستخداملا حاجة لكتابة نفس الخصائص يدويًا لكل كائن.
التنظيمالكود منظم أكثر وأسهل في التوسعة.
استخدام مع Prototypeيمكن ربط دوال مشتركة لكل الكائنات عن طريق prototype لتوفير الذاكرة.
🧠 مثال باستخدام prototype (أفضل ممارسة):
function Car(brand, year) {
  this.brand = brand;
  this.year = year;
}

Car.prototype.getInfo = function() {
  return this.brand + " - " + this.year;
};

const car1 = new Car("Toyota", 2020);
console.log(car1.getInfo()); // "Toyota - 2020"
JavaScript

هنا، الدالة getInfo لا يتم إنشاؤها لكل كائن، بل تتم مشاركتها بينهم.

🔄 مقارنة بين Object Literal و Constructor:
المقارنةObject LiteralConstructor Function + new
✅ سهولة الاستخدامبسيط وسريعيحتاج إلى كتابة دالة وإنشاء كائن
♻️ قابلية التكراركل مرة تكتب كائن يدويًاتستخدم نفس الدالة لأي عدد من الكائنات
📦 إدارة الذاكرةالدوال تنسخ لكل كائنيمكن مشاركة الدوال عبر prototype
👷‍♂️ مثالي لـكائنات بسيطة وثابتةكائنات كثيرة ومتغيرة أو ديناميكية
⚠️ ملاحظات مهمة:
  • إذا نسيت تكتب new عند استدعاء الـ Constructor:
const x = Person("Ali", 22); // بدون new
console.log(x); // undefined!
JavaScript
  • فيفي هذه الحالة، this لن يشير للكائن الجديد، بل للـ window في المتصفح أو undefined في strict mode.

    🧠 هل يمكن استخدام class بدلاً من new + function؟
    نعم! في ES6 ظهر الـ class syntax كبديل أنظف: هذه الحالة، this لن يشير للكائن الجديد، بل للـ window في المتصفح أو undefined في strict mode.

نعم! في ES6 ظهر الـ class syntax كبديل أنظف:

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  sayHello() {
    console.log("Hello from " + this.name);
  }
}

const p = new Person("Yasin", 26);
p.sayHello();
JavaScript

لكن تحت الغطاء، class هي مجرد طريقة حديثة لنفس الفكرة (Constructor + Prototype).