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