كيف تبدأ سريعًا مع VUE3.0: أدخل
ما new
؟
يقوم عامل التشغيل
new
بإنشاء مثيل لنوع كائن محدد من قبل المستخدم أو أحد أنواع الكائنات المضمنة التي تحتوي على مُنشئ.
لا يزال الأمر غامضًا بعض الشيء بمجرد النظر إلى التعريف، دعنا نلقي نظرة على مثال محدد لفهم وظيفة new
في JavaScript
.
// لا يمكنك إنقاص الوزن في الحياة الواقعية، ولكن يجب أن تظل نحيفًا عبر الإنترنت function Thin_User(name, age) { this.name = name; this.age = age; } Thin_User.prototype.eatToMuch = الوظيفة () { // أحلام اليقظة واترك الدموع السمينة console.log('أنا آكل كثيرًا، لكني نحيف جدًا!!!'); } Thin_User.prototype.isThin = true; const xiaobao = new Thin_User('zcxiaobao', 18); console.log(xiaobao.name); // zcxiaobao console.log(xiaobao.age); // 18 console.log(xiaobao.isThin); // أنا آكل كثيراً، لكني نحيف جداً!!! xiaobao.eatToMuch();
من خلال المثال أعلاه، يمكننا أن نجد xiaobao
يمكنه:
Thin_User
Thin_User.prototype
،ووصفها بشكل أكثر وضوحًا، ويقوم new
بهذه الأشياء:
__proto__->Thin_User.prototype
الخاص بالكائنthis
إلى الكائن الجديدنظرًا لأن new
هي كلمة أساسية، فلا يمكننا تجاوزها مثل الطريقة عالية الترتيب لمحاكاة المصفوفات، لذلك نكتب. وظيفة createObject
لمحاكاة التأثير new
. الاستخدام كما يلي:
الدالة Thin_User(name, age) {} const u1 = مستخدم Thin_user(...) جديد const u2 = createObject(Thin_User, ...a)
وفقًا للتحليل أعلاه، فإن الخطوات العامة لكتابة createObject
هي:
obj
obj.__proto__->constructor.prototype
( لكن JavaScript لا ينصح بذلك من خلال تعديل سمات __proto__ مباشرةً، يتم توفير طريقة setPrototypeOf لتعديل النموذج الأولي على وجه التحديد )constructor.call/apply(obj, ...)
لإضافة سمات إلى obj
وإرجاعobj
__proto__和prototype
. يمكنك رؤية JavaScript لفهم كامل لـ النماذج الأولية وسلاسل النماذج الأولية.
call/apply
، يمكنك مشاهدة البرنامج التعليمي لـ JavaScript عند الاتصال والتطبيق.
بعد تعلم ذلك، يمكننا كتابة الإصدار الأول من الكود:
function createObject(Con) {. // إنشاء كائن جديد obj // var obj = {}; يمكن أيضًا أن يكون var obj = Object.create(null); // تحويل obj.__proto__ -> النموذج الأولي للمنشئ // (غير مستحسن) obj.__proto__ = Con.prototype Object.setPrototypeOf(obj, Con.prototype); // تنفيذ المُنشئ Con.apply(obj, [].slice.call(arguments, 1)); // إرجاع كائن جديد return obj;}
كما نعلم جميعًا، فإن الوظائف لها قيم إرجاع، لذلك إذا كان للمنشئ قيمة إرجاع، فما هي النتيجة التي يتم إرجاعها بعد التنفيذ النهائي new
؟
على افتراض أن قيمة الإرجاع المُنشئة هي نوع أساسي، فلنلقي نظرة على نتيجة الإرجاع النهائية:
function Thin_User(name, age) { this.name = name; this.age = age; العودة "سأظل نحيفة إلى الأبد" ؛ } Thin_User.prototype.eatToMuch = الوظيفة () { console.log('أنا آكل كثيرًا، لكني نحيف جدًا!!!'); } Thin_User.prototype.isThin = true; const xiaobao = new Thin_User('zcxiaobao', 18); console.log(xiaobao.name); // zcxiaobao console.log(xiaobao.age); // 18 console.log(xiaobao.isThin); // أنا آكل كثيراً، لكني نحيف جداً!!! xiaobao.eatToMuch();
يبدو أن نتيجة الإرجاع النهائية لا تخضع لأي تدخل.
لا تقلق، دعنا نستمر في اختبار الموقف حيث تكون القيمة المرجعة كائنًا.
وظيفة الكائن Thin_User(name, age) { this.name = name; this.age = age; يعود { الاسم: اسم، العمر: العمر * 10، الدهون: صحيح } } Thin_User.prototype.eatToMuch = الوظيفة () { // أحلام اليقظة واترك الدموع السمينة console.log('أنا آكل كثيرًا، لكني نحيف جدًا!!!'); } Thin_User.prototype.isThin = true; const xiaobao = new Thin_User('zcxiaobao', 18); // خطأ: xiaobao.eatToMuch ليس دالة xiaobao.eatToMuch();
عندما قمت بتنفيذ eatToMuch
، أبلغت وحدة التحكم عن خطأ مباشرةً ولم تكن هناك وظيفة حالية، لذلك قمت بطباعة كائن xiaobao
:
لقد وجد أن age
كائن xiaobao
قد تغير، وأضيفت سمة fat
، وهي بالضبط نفس القيمة المرجعة للمنشئ.
بعد قراءة هذين المثالين، يمكنك بشكل أساسي توضيح الموقف عندما يُرجع المُنشئ قيمة: عندما يُرجع المُنشئ كائنًا، يتم إرجاع الكائن مباشرةً.
وظيفةcreateObject(Con) { // إنشاء كائن جديد obj // var obj = {}; يمكن أيضًا أن يكون var obj = Object.create(null); // تحويل obj.__proto__ -> النموذج الأولي للمنشئ // (غير مستحسن) obj.__proto__ = Con.prototype Object.setPrototypeOf(obj, Con.prototype); // تنفيذ المُنشئ وقبول القيمة المرجعة للمنشئ const ret = Con.apply(obj, [].slice.call(arguments, 1)); // إذا كانت القيمة المرجعة للمنشئ كائنًا، فقم بإرجاع الكائن مباشرةً // وإلا، قم بإرجاع obj نوع الإرجاع (ret) === "كائن" ?