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/