【问题标题】:javascript function overloadingjavascript函数重载
【发布时间】:2010-10-06 02:41:50
【问题描述】:

我可以执行以下操作吗?

function contains(element) {

 // if the element is a Vertex object, do this
 if (element instanceof Vertex) {

  var vertex = element;
  for ( var index in self.verticies) {
   if (self.verticies[index].id == vertex.id) {
    return true;
   }
  }
  return false;
 }
 // else if the element is an Edge object, do this 
 else if (element instanceof Edge) {

  var edge = element;
  for ( var index in self.verticies) {
   if (self.verticies[index].id == edge.id) {
    return true;
   }
  }
  return false;
 } else {
  // shouldn't come here
  return false;
 }
};

基本上...我希望能够调用 contains() 并将其传递给 Vertex 对象或 Edge 对象,但我不想有重复的代码。这是正确的方法吗?此外,我是否正确处理了var vertex = element / var edge = element 的分配?我想将 element 分配给另一个 Vertex/Edge 对象并将其用于查找。

如果我需要澄清,请告诉我。

谢谢, 赫里斯托

【问题讨论】:

    标签: javascript object overloading


    【解决方案1】:

    您的代码应该可以正常工作。

    但是请注意,写var edge = element 没有任何意义(除了清晰,这是一件好事)。
    Javascript 变量是无类型的; edgeelement 没有区别。

    另外,你应该抛出一个异常而不是

    // shouldn't come here
    return false;
    

    最后,您为什么要在self.verticies 中搜索Edge

    请注意,顺便说一下,您仍然有重复的代码。
    你可以像这样重写你的函数:

    function contains(element) {
        var searchSet;
    
        // if the element is a Vertex object, do this
        if (element instanceof Vertex) 
            searchSet = self.verticies;
        else if (element instanceof Edge)
            searchSet = self.edges;
        else
            throw Error("Unexpected argument");
    
        for (var i = 0; i < searchSet.length; i++) {
            if (searchSet[i].id == element.id) 
                return true;
        }
        return false;
    }
    

    【讨论】:

    • 不应该是element.id而不是edge.id吗?
    • 这是一个复制/粘贴错误。对于那个很抱歉。但感谢您的建议。另外,我不知道我可以抛出错误 JavaScript ......这些如何在浏览器中工作?浏览器是否只显示一个弹出窗口? +1 以获得出色的回应:)
    • 错误的行为方式与标准错误(例如,1 / 0)的行为方式相同。
    • how do these work in a browser? Does the browser just show a pop up window? 听起来您还有更多问题要问
    【解决方案2】:

    这是一种有几个优点的方法:

    1. 较小的函数(没有大的 if/else if 链)
    2. 在没有任何额外编码的情况下为缺少的函数产生适当的错误

    看看你的想法:

    function contains(element) {
        window['contains_' + typeof element](element);
    };
    
    contains_string = function(element) {
        alert('string: ' + element);
    };
    
    contains('hi!'); // produces alert
    contains(3); // error: 'undefined is not a function'
    

    ​它也有一些缺点。

    1. 错误消息的信息量不是很大(虽然不比默认行为差多少)
    2. 您在这里稍微“污染”了“窗口”对象(它作为对象的一部分会更好)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多