2013-07-19 2 views
1

Как проверить, существует ли прототипированная функция?проверить, существует ли функция в javascript

Чуть больше объяснений:

Как вы можете видеть в примере кода, я всегда буду иметь commonFunction() как для X1 и X2.

Я хотел бы сообщить, если X1 и X2 имеют свои собственные myOwnFunction().

Важно заметить, что из первых рук я не знаю, какую функцию я буду называть. Вот почему мне нужен динамический способ сбора этой информации.

КОД:

function FunctionMain(){}; 

FunctionMain.FunctionSub = new FunctionSub(); 

function FunctionX1() 
{ 
    FunctionX1.prototype.commonFunction = function() 
    { 
     console.log("Hello, I'm X1"); 
    } 

    FunctionX1.prototype.myOwnFunctionX1 = function() 
    { 
     console.log("This my own function"); 
    }  
} 

function FunctionX2() 
{ 
    FunctionX2.prototype.commonFunction = function() 
    { 
     console.log("Hello, I'm X2"); 
    } 

    //I don't have myOwnFunctionX2() 
} 

function FunctionSub() 
{ 
    FunctionSub.prototype.FunctionX1 = new FunctionX1(); 
    FunctionSub.prototype.FunctionX2 = new FunctionX2(); 
} 

//This call works! 
FunctionMain.FunctionSub.FunctionX1.commonFunction(); 
FunctionMain.FunctionSub.FunctionX2.commonFunction(); 


//what kind of test should I use? 
if(typeof "FunctionMain.FunctionSub.FunctionX1.myOwnFunctionX1" == "function") 
{ 
    console.log("It exists!"); 
} 

if(typeof window["FunctionMain.FunctionSub.FunctionX1.myOwnFunctionX1"] == "function") 
{ 
    console.log("It exists!"); 
} 

FIDDLE: http://jsfiddle.net/matias/FTzjW/

ответ

-3

Это решение, которое сработало для меня.

Проверить это jsbin (не знаю, почему это не работает в jsfiddle)

ПОЛНЫЙ КОД:

function FunctionMain(){} 

FunctionMain.FunctionSub = new FunctionSub(); 

function FunctionX1() 
{ 
    FunctionX1.prototype.commonFunction = function() 
    { 
     console.log("Hello, I'm X1"); 
    } 

    FunctionX1.prototype.myOwnFunctionX1 = function() 
    { 
     console.log("This my own function"); 
    }  
} 

function FunctionX2() 
{ 
    FunctionX2.prototype.commonFunction = function() 
    { 
     console.log("Hello, I'm X2"); 
    } 

    //I don't have myOwnFunctionX2() 
} 

function FunctionSub() 
{ 
    FunctionSub.prototype.FunctionX1 = new FunctionX1(); 
    FunctionSub.prototype.FunctionX2 = new FunctionX2(); 
} 

//This call works! 
FunctionMain.FunctionSub.FunctionX1.commonFunction(); 
FunctionMain.FunctionSub.FunctionX2.commonFunction(); 


//use this test 
function testFunction(function_to_find) 
{ 
    var context = window; 
    var functions = function_to_find.split("."); 
    var method = functions.pop(); 

    for (var i = 0; i < functions.length; i++) 
    { 
     context = context[functions[i]]; 
    } 

    return typeof context[method]; 
} 

if(testFunction("FunctionMain.FunctionSub.FunctionX1.myOwnFunctionX1") == "function") console.log("yes x1!"); 

if(testFunction("FunctionMain.FunctionSub.FunctionX2.myOwnFunctionX2") == "function") console.log("yes x2!"); 
+0

Что происходит, когда контекст становится неопределенным до достижения цели? EDIT: Я вижу, что это именно то, что произошло в вашей скрипке. – Adam

+0

@ Адам Извините, я вас не понял. Вы можете мне объяснить? –

+0

По-прежнему устанавливается прототип внутри тела конструктора, это неправильно. Вы хоть представляете, для чего нужен прототип? http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711, чтобы проверить, какие свойства у объекта вы можете использовать 'for (something in myObject)' 'hasOwnProperty' и перейти к конструктору' myObject = myObject.constructor', пока вы не достигнете функции. Но так, как вы наследуете сейчас, вы уничтожаете свойство конструктора на прототипе объекта. – HMR

7

Это странно, не делают этого

function FunctionX2() 
{ 
    FunctionX2.prototype.commonFunction = function() 
    { 
     console.log("Hello, I'm X2"); 
    } 

    //I don't have myOwnFunctionX2() 
} 

ли это вместо

var FunctionX2 = function() { 
    // constructor 
}; 

FunctionX2.prototype.commonFunction = function() { 
    console.log("Hello, I'm X2"); 
}; 

Проверьте, если он существует непосредственно

typeof FunctionX2.prototype.commonFunction === 'function'; 
// => true 

Или с экземпляром

var f2 = new FunctionX2(); 
typeof f2.commonFunction === 'function'; 
// => true 

Вот доказательство того, что проверка функции динамически возможно

var functionExists = function(receiver, functionName) { 
    return typeof receiver[functionName] === 'function'; 
}; 

var commonFunctionExists = function(receiver) { 
    return functionExists(receiver, 'commonFunction'); 
}; 

Некоторые тесты

var f1 = new FunctionX1(); 
commonFunctionExists(f1); 
// => true 

var f2 = new FunctionX2(); 
commonFunctionExists(f2); 
// => true 

var obj = new Object(); 
commonFunctionExists(obj); 
// => false 
+0

Помните, что я сказал: «Важно отметить, что из первых рук Я не знаю, какую функцию я буду называть. Вот почему мне нужен динамический способ сбора этой информации ». Вы явно проверяете FunctionX2 –

+1

Мне ясно, что вы неправильно структурируете свою программу. Я имею в виду, просто взглядом на то, как вы кодируете классы только в JavaScript. Кажется, что вы где-то неправильно понимаете основы. Я готов помочь вам, но как насчет исправления вышеприведенного кода, давайте посмотрим, какова ваша цель. Вот пример: вместо того, чтобы спрашивать: «Как я могу взвесить слона с шкалой ванной?» спросите: «Как я могу быть уверен, что мой любимый слон не имеет лишнего веса?» – naomik

+0

Разница заключается в следующем: спросите, как вы должны достичь своей цели, а не как реализовать решение, которое, по вашему мнению, достигнет вашей цели. Первый открывает двери для многих возможных решений, в то время как последний выведет вас в одно решение, которое может быть ошибочным с самого начала. – naomik

Смежные вопросы