Javascript 为什么这个原型失败了?

Javascript 为什么这个原型失败了?,javascript,Javascript,该函数工作正常,但当我尝试添加方法hide并尝试像'menu.hide;那样调用它时;,它抛出错误:TypeError:Object没有方法“隐藏”我误解了什么 是的,我用谷歌搜索了这个问题,我就是不明白。非常感谢您的提示。构造函数需要自己返回此值;。当前,它返回一个DOM对象,如果没有传递字符串,则返回未定义的对象 试试这个: function _(e) { if (typeof e == 'string') { if (e.charAt(0) == '#') {

该函数工作正常,但当我尝试添加方法hide并尝试像'menu.hide;那样调用它时;,它抛出错误:TypeError:Object没有方法“隐藏”我误解了什么

是的,我用谷歌搜索了这个问题,我就是不明白。非常感谢您的提示。

构造函数需要自己返回此值;。当前,它返回一个DOM对象,如果没有传递字符串,则返回未定义的对象

试试这个:

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)
}
您可以这样调用构造函数:

function _(e) {
  if (!(this instanceof _)){
    return new _(e);
  }

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

}

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

尝试如下定义您的函数:

e = _('#myDiv');
e.hide();
编辑
是的,当然不要忘记返回它。

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

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

var _ = function (e) { };

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

在我看来,您似乎试图调用u函数的返回值时隐藏。我希望:var x=new u'menu';x、 隐藏;工作,但我不认为这是你想要的。也许你应该从函数中返回一个调用hide的对象。必须在hide中设置return,那么hide呢;您没有提到hanks,它只不过稍微破坏了第一个函数的简单性,因为它不返回元素directly@wije:如果要直接返回元素,则必须将hide方法添加到每个可能元素类型的原型中,而不是uuType。I?jQuery是如何实现的?@wije:jQuery方法返回的是一个jQuery对象,而不是元素。由于函数是作为普通函数使用的,而不是构造函数,因此这将是全局范围,即窗口。我以前的回答很差。我又试了一次。你可以直接调用构造函数'myDivID',它将返回一个u的实例,我想这就是你想要的。比不得不这样调用要好得多:el=new'myDivID';谢谢,行得通。除了我似乎必须打电话给“myDiv”el不是“myDiv”来得到div是的,你在写。我发现您的代码对标记名、类和ID很敏感。我会更新我的答案。
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;
  }
}