2013-07-19 31 views
1

如何检查原型函数是否存在?检查javascript中是否存在函数

多一点解释:

正如你可以在示例代码中看到的,我将永远有两个X1X2一个commonFunction()

我想告诉你X1X2有他们自己的myOwnFunction()

重要的是要注意到,第一手我不知道我会打电话给哪个功能。这就是为什么我需要一种动态的方式来收集这些信息。

CODE

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

当在达到最终结果之前上下文变得未定义时会发生什么?编辑:我看到这正是你的小提琴中发生的事情。 – Adam

+0

@亚当我很抱歉,我不了解你。你能解释我吗? –

+0

仍然在构造函数体内设置原型,这是错误的。你有什么想法是什么样的原型? http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711检查对象有什么属性可以使用'for(something in myObject)'hasOwnProperty'并且上去构造函数' myObject = myObject.constructor'直到你到达Function。但是现在你继承的方式是销毁对象原型的构造函数属性。 – 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