1. هذا يشير إلى كائن إنشاء مُنشئ
في المقالة السابقة ، ذكرنا الفرق بين استخدام المنشئين الجدد وعدم الاتصال ، كما هو موضح في المثال التالي:
نسخة الكود كما يلي:
وظيفة بنيامين (اسم المستخدم ، الجنس) {
this.username = اسم المستخدم ؛
this.Sex = الجنس ؛
}
var Benjamin = New Benjamin ("Zuojj" ، "Male") ؛
// المخرجات: بنيامين {الجنس: "ذكر" ، اسم المستخدم: "Zuojj"}
console.log (بنيامين) ؛
var ben = benjamin ("Zhangsan" ، "Female") ؛
// المخرجات: غير محدد
console.log (ben) ؛
عندما يتم استدعاء المنشئ كدالة طبيعية ، لا يتم إرجاع أي قيمة ، وهذا يشير إلى الكائن العالمي. فكيف يمكننا تجنب المشاكل الناجمة عن عدم وجود كلمات رئيسية جديدة؟
نسخة الكود كما يلي:
وظيفة بنيامين (اسم المستخدم ، الجنس) {
// تحقق مما إذا كان "هذا" كائن "بنيامين"
إذا (هذا مثيل بنيامين) {
this.username = اسم المستخدم ؛
this.Sex = الجنس ؛
}آخر {
إعادة نيو بنيامين (اسم المستخدم ، الجنس) ؛
}
}
var Benjamin = New Benjamin ("Zuojj" ، "Male") ؛
// المخرجات: بنيامين {الجنس: "ذكر" ، اسم المستخدم: "Zuojj"}
console.log (بنيامين) ؛
var ben = benjamin ("Zhangsan" ، "Female") ؛
// المخرجات: Benjamin {username: "Zhangsan" ، الجنس: "أنثى"}
console.log (ben) ؛
في المثال أعلاه ، نتحقق أولاً من ما إذا كان هذا مثيلًا لبنيامين ، إن لم يكن ، استخدم جديدًا للاتصال تلقائيًا بالمنشئ وتثبيته ، مما يعني أننا لم نعد بحاجة إلى القلق بشأن فقدان مُنشئ إنشاءات الكلمات الرئيسية الجديدة. بالطبع ، قد نطور عادة سيئة بهذه الطريقة. ماذا لو تجنبنا هذه الظاهرة؟ يمكننا رمي خطأ مثل هذا:
نسخة الكود كما يلي:
وظيفة بنيامين (اسم المستخدم ، الجنس) {
// تحقق مما إذا كان "هذا" كائن "بنيامين"
إذا (هذا مثيل بنيامين) {
this.username = اسم المستخدم ؛
this.Sex = الجنس ؛
}آخر {
// إذا لم يكن كذلك ، رمي الخطأ.
رمي خطأ جديد ("" بنيامين "استدعى بدون" جديد ") ؛
}
}
2. هذا يشير إلى الكائن الذي يدعو الوظيفة
انظر المثال التالي:
نسخة الكود كما يلي:
var x = 10 ؛
var obj = {
X: 10 ،
الإخراج: function () {
// المخرجات: صحيح
console.log (هذا === OBJ) ؛
إرجاع this.x ؛
} ،
innerrobj: {
x: 30 ،
الإخراج: function () {
// المخرجات: صحيح
console.log (هذا === obj.innerobj) ؛
إرجاع this.x ؛
}
}
} ؛
// المخرجات: 10
console.log (obj.output ()) ؛
// المخرجات: 30
console.log (obj.innerobj.output ()) ؛
3. هذا يشير إلى الكائن العالمي
عند مناقشة المنشئ أعلاه ، ناقشنا أيضًا أنه عندما لا يكون جديدًا قابلاً للتطبيق ، فإن هذا سيشير إلى الكائن العالمي. دعونا نلقي نظرة على مثالين شائعان عرضة للأخطاء:
نسخة الكود كما يلي:
var x = 100 ؛
var obj = {
X: 10 ،
الإخراج: function () {
(وظيفة() {
// المخرجات: صحيح
console.log (هذا === نافذة) ؛
// المخرجات: داخلي: 100
console.log ("Inner:" + this.x) ؛
}) () ؛
إرجاع this.x ؛
}
} ؛
// المخرجات: 10
console.log (obj.output ()) ؛
عند استخدام عمليات الإغلاق ، يتغير النطاق ، ويشير هذا إلى النافذة (في المتصفح).
نسخة الكود كما يلي:
var x = 100 ؛
var obj = {
X: 10 ،
الإخراج: function () {
إرجاع this.x ؛
}
} ؛
var output = obj.output ؛
// المخرجات: 10
console.log (obj.output ()) ؛
// المخرجات: 100
console.log (output ()) ؛
var obj2 = {
x: 30 ،
الإخراج: obj.output
}
// المخرجات: 30
console.log (obj2.Output ()) ؛
في هذا الوقت ، يشير هذا دائمًا إلى الكائن في وقت استدعاء الوظيفة.
4. هذا يشير إلى الكائن المعين بواسطة طريقة التطبيق/call ()
نسخة الكود كما يلي:
var x = 100 ؛
var obj = {
X: 10 ،
الإخراج: function () {
إرجاع this.x ؛
}
} ؛
// المخرجات: 10
console.log (obj.output ()) ؛
var obj2 = {
X: 40 ،
الإخراج: obj.output
}
// المخرجات: 40
console.log (obj.output.call (obj2)) ؛
// المخرجات: 10
console.log (obj2.output.apply (obj)) ؛
5. تشير وظيفة رد الاتصال هذه إلى الكائن الذي أشار إليه هذه الوظيفة التي تستدعي رد الاتصال.
نسخة الكود كما يلي:
// <input type = "text" value = "3" id = "txt_username">
$ ("#username"). على ("انقر" ، دالة () {
console.log (this.value) ؛
}) ؛
6. هذا في function.prototype.bind
تنشئ طريقة BIND () وظيفة جديدة ، عند استدعاءها ، تم تعيين هذه الكلمة الرئيسية على القيمة المقدمة ، مع تسلسل معين من الوسائط التي تسبق أي مقدمة عند استدعاء الوظيفة الجديدة.
مثال 1:
نسخة الكود كما يلي:
وظيفة person () {
إرجاع هذا.
}
//function.prototype.bind
var per = person.bind ({
الاسم: "Zuojj"
}) ؛
console.log (PER) ؛
var obj = {
الاسم: "بن" ،
الشخص: شخص ،
لكل: لكل
} ؛
// المخرجات: بن ، زوكوج
console.log (obj.person () ، obj.per ()) ؛
مثال 2:
نسخة الكود كما يلي:
this.x = 9 ؛
وحدة var = {
x: 81 ،
getx: function () {return this.x ؛ }
} ؛
// المخرجات: 81
console.log (module.getx ()) ؛
var getx = module.getx ؛
// المخرجات: 9 ، لأنه في هذه الحالة ، "هذا" يشير إلى الكائن العالمي
console.log (getx) ؛
// قم بإنشاء وظيفة جديدة مع "هذا" المرتبط بالوحدة النمطية
var boundgetx = getx.bind (وحدة) ؛
// المخرجات: 81
console.log (boundgetx ()) ؛