javascript - لغة - ملفات جافا سكريبت




ما الكلمة الأساسية "الجديدة" في JavaScript؟ (9)

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

  • ما هذا؟
  • ماذا تحل من مشكلات؟
  • متى يكون مناسبًا ومتى لا؟

لذلك ربما لا يتم إنشاء مثيلات كائن

يتم استخدامه بالضبط لذلك. يمكنك تحديد منشئ دالة مثل:

function Person(name) {
    this.name = name;
}

var john = new Person('John');

ومع ذلك فإن الفائدة الإضافية التي توفرها ECMAScript هي إمكانية التوسع في خاصية .prototype ، حتى يمكننا القيام بشيء ما مثل ...

Person.prototype.getName = function() { return this.name; }

جميع الكائنات التي تم إنشاؤها من هذا المُنشئ ستحصل الآن على اسم getName بسبب سلسلة النموذج الأولي التي يمكنهم الوصول إليها.


للمبتدئين لفهمها بشكل أفضل

جرب التعليمات البرمجية التالية في وحدة التحكم.

function Foo() { 
    return this; 
}

var a = Foo();       //returns window object
var b = new Foo();   //returns empty object of foo

console.log(a instanceof Window);  // true
console.log(a instanceof Foo);     // false

console.log(b instanceof Window);  // false
console.log(b instanceof Foo);     // true

الآن يمكنك قراءة مجتمع الويكي الإجابة :)


أحيانًا ، تكون الشفرة أسهل من الكلمات:

var func1 = function (x) { this.x = x; }                    // used with 'new' only
var func2 = function (x) { var z={}; z.x = x; return z; }   // used both ways
func1.prototype.y = 11;
func2.prototype.y = 12;

A1 = new func1(1);      // has A1.x  AND  A1.y
A2 =     func1(1);      // undefined ('this' refers to 'window')
B1 = new func2(2);      // has B1.x  ONLY
B2 =     func2(2);      // has B2.x  ONLY

بالنسبة لي ، طالما أنا لا النموذج ، وأنا استخدم أسلوب func2 لأنه يعطيني المزيد من المرونة داخل وخارج وظيفة.


الكلمة الأساسية new هي لإنشاء مثيلات كائن جديد. ونعم ، javascript هي لغة برمجة ديناميكية ، والتي تدعم نموذج البرمجة الموجهة للكائنات. يتم دائمًا استخدام اصطلاح تسمية الكائن ، استخدم حرفًا كبيرًا للكائنات التي من المفترض أن يتم إنشاؤها بواسطة الكلمة الأساسية الجديدة.

obj = new Element();

تقوم الكلمة الأساسية new بإنشاء مثيلات للكائنات باستخدام وظائف كمنشئ. على سبيل المثال:

var Foo = function() {};
Foo.prototype.bar = 'bar';

var foo = new Foo();
foo instanceof Foo; // true

ترث المثيلات من prototype لوظيفة منشئ. لذلك أعطيت المثال أعلاه ...

foo.bar; // 'bar'

تقوم الكلمة الأساسية new بتغيير السياق الذي يتم تشغيل الدالة تحته وإرجاع المؤشر إلى هذا السياق.

عندما لا تستخدم الكلمة الأساسية new ، فإن السياق الذي تعمل تحته الدالة Vehicle() هو نفس السياق الذي تقوم من خلاله باستدعاء وظيفة Vehicle . ستشير this الكلمة الأساسية إلى السياق نفسه. عند استخدام new Vehicle() ، يتم إنشاء سياق جديد بحيث تشير الكلمة الأساسية الموجودة داخل الدالة إلى السياق الجديد. ما تحصل عليه في المقابل هو السياق الذي تم إنشاؤه حديثًا.


جافا سكريبت هي لغة برمجة ديناميكية تدعم نموذج البرمجة الموجهة للكائنات ، وتستخدم في إنشاء نسخ جديدة من الكائن.

الطبقات ليست ضرورية للأشياء - جافا سكريبت هي لغة أساس النموذج .


لنفترض أن لديك هذه الوظيفة:

var Foo = function(){
  this.A = 1;
  this.B = 2;
};

إذا كنت تسميها كدالة مستقلة مثل:

Foo();

يؤدي تنفيذ هذه الوظيفة إلى إضافة خاصيتين إلى كائن window ( A و B ). وتضيفه إلى window لأن window هي الكائن الذي يطلق عليه الدالة عندما تقوم بتنفيذها مثل هذا ، this في الوظيفة هو الكائن الذي يطلق عليه الدالة. في Javascript على الأقل.

الآن ، أطلق عليه اسمًا new :

var bar = new Foo();

ما يحدث عند إضافة new إلى استدعاء دالة هو أن يتم إنشاء كائن جديد (فقط var bar = new Object() ) وأن this داخل الدالة يشير إلى Object الجديد الذي قمت بإنشائه ، بدلاً من الكائن الذي يسمى الوظيفة. حتى الآن bar هو كائن مع خصائص A و B أي وظيفة يمكن أن تكون منشئ ، فقط لا معنى له.


يمكن أن تختلف JavaScript جيدًا لكل si بشكل كبير من النظام الأساسي إلى النظام الأساسي ، حيث إنه دائمًا تطبيق للمواصفات الأصلية EcmaScript.

في أي حال ، بشكل مستقل عن تنفيذ جميع تطبيقات جافا سكريبت التي تتبع مواصفات EcmaScript الصحيحة ، سوف يعطيك لغة موجهة للكائن. وفقًا لمعيار ES:

ECMAScript هي لغة برمجة موجهة للكائنات لإجراء عمليات حسابية ومعالجة الكائنات الحسابية داخل بيئة مضيف.

والآن بعد أن اتفقنا على أن JavaScript هو تطبيق لـ EcmaScript وبالتالي فهي لغة موجهة للكائن. تعريف العملية new في أي لغة موجهة للكائنات ، تقول أن مثل هذه الكلمة تستخدم لإنشاء مثيل كائن من فئة من نوع معين (بما في ذلك الأنواع المجهولة ، في حالات مثل C #).

في EcmaScript ، لا نستخدم الفصول الدراسية ، حيث يمكنك القراءة من المواصفات:

لا تستخدم ECMAScript فئات مثل تلك الموجودة في C ++ أو Smalltalk أو Java. وبدلاً من ذلك ، يمكن إنشاء الكائنات بطرق مختلفة ، بما في ذلك عن طريق تدوين حرفي أو عن طريق المنشئات التي تنشئ كائنات ثم تقوم بتنفيذ التعليمة البرمجية التي تقوم بتهيئة كل أو جزء منها عن طريق تعيين قيم أولية لخصائصها. كل مُنشئ هو دالة لها خاصية مسمى - prototype ‖ تُستخدم لتنفيذ الوراثة القائمة على النموذج الأولي والخصائص المشتركة. يتم إنشاء الكائنات بواسطة
باستخدام المنشئات في التعبيرات الجديدة ؛ على سبيل المثال ، ينشئ تاريخ جديد (2009 ، 11) كائن تاريخ جديد. استدعاء مُنشئ دون استخدام جديد له عواقب تعتمد على المُنشئ. على سبيل المثال ، يُنشئ Date () تمثيل سلسلة من التاريخ والوقت الحالي بدلاً من كائن.





new-operator