
كيف تبدأ سريعًا مع 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_UserThin_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 هي:
objobj.__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) === "كائن" ?