function _(e) {
    if (typeof e == 'string') {
        if (e.charAt(0) == '#') {
            return document.getElementById(e.slice(1));
        } else if (e.charAt(0) == '.') {
                var c = document.getElementsByClassName(e.slice(1));
            return (c.length==1)?c[0]:c;
        } else {
                var t = document.getElementsByTagName(e);
            return (t.length==1)?t[0]:t;
        }
    } else {
    console.log('Error. Not a valid string in _.');
    }
}

_.prototype.hide = function() {
//testing
console.log(this)
}


该函数工作正常,但是当我尝试添加方法hide并尝试像_('#menu').hide();那样调用它时,会引发错误:TypeError: Object #<HTMLDivElement> has no method 'hide'我误解了什么?

是的,我确实在Google上搜索了此问题,但我不明白。一个提示将不胜感激。

最佳答案

您将构造函数用作常规函数,因此它不会创建对象,而只会返回您指定的内容。

您可以将其用作常规函数,但随后需要将自身作为构造函数调用以创建要返回的对象,并在将其用作构造函数时进行处理:

function _(e) {
  if (!this instanceof _) {
    if (typeof e == 'string') {
      if (e.charAt(0) == '#') {
        return new _(document.getElementById(e.slice(1)));
      } else if (e.charAt(0) == '.') {
        var c = document.getElementsByClassName(e.slice(1));
        return new _((c.length==1)?c[0]:c);
      } else {
        var t = document.getElementsByTagName(e);
        return new _((t.length==1)?t[0]:t);
      }
    } else {
      console.log('Error. Not a valid string in _.');
    }
  } else {
    this.elements = e;
  }
}


您可能会考虑始终为元素使用数组,即使它是单个元素也是如此。现在,elements属性将是一个元素或元素数组,因此您每次使用它时都必须进行检查...

关于javascript - 为什么这个原型(prototype)失败了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9225773/

10-12 12:30
查看更多