سؤال

أحصل على خطأ "TestFunc غير محدد" عند هذا القليل من التعليمات البرمجية ...

/* my_object.js */
"use strict";
function MyObject (param) {
    this.param = param;
}

MyObject.prototype.TestFunc = function () {
    console.log ('in TestFunc');
}

MyObject.prototype.RealFunc = function () {
    // I have tried 3 different ways to call TestFunc:
    // 1.
    this.TestFunc ();

    // 2.
    TestFunc ();

    // 3. (I didn't really think this would work,
    //     but thought it was worth a try...)
    MyObject.TestFunc ();
}

... يحصل على تشغيل من هذا القليل من التعليمات البرمجية:

/* index.js */
var myObj = new MyObject ('test');
myObj.RealFunc (); // Firebug: "TestFunc is not defined"
هل كانت مفيدة؟

المحلول

// 1.
this.TestFunc ();

هذا جيد. التي ستعمل، مع إزالتها المكالمات الأخرى.

(حسنا، يعمل طالما أنك لا تقشر RealFunc من مالكها واتصل بها بمفردها var method= myObj.RealFunc; method(); أو عبر معالج الأحداث أو المهلة. في هذه الحالة this في RealFunC لن يكون مثيل MyoBject وستحتاج إلى إلقاء نظرة على الإغلاق أو Function.bind للحصول عليه للعمل.)

// 2.
TestFunc ();

كلا، لا يتم تعريف TestFunc كمتغير في النطاق المحلي أو العالمي. هذا يؤدي الخطأ الذي تحصل عليه من Firebug.

// 3. (I didn't really think this would work,
//     but thought it was worth a try...)
MyObject.TestFunc ();

لا، كنت على حق. :-) سيكون من MyObject.prototype.TestFunc.call(this), ، القيام به صراحة.

يخلط JavaScript نوع من الأمر من خلال وضع بعض الأساليب نفسها على وظائف المنشئ القياسية للأشياء المدمجة كما في النماذج الأولية (على سبيل المثال String.split موجود أين حقا فقط String.prototype.split ينبغي). ولكن هذا لا يحدث لكائناتك الخاصة إلا إذا قلت صراحة مثل MyObject.TextFunc= MyObject.prototype.TextFunc.

نصائح أخرى

البديل 1 يبدو صحيحا. جربت رمزك في Executejs وتخطى 2. و 3. عملت (على الرغم من أنني قمت بإزالة المكالمة console.log وتغييرها إلى alert). TestFunc يسمى داخل RealFunc.

ماذا يحدث إذا قمت بإزالة "use strict";?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top