2012-02-10 107 views
1
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) 
} 

该功能工作正常,但是当我尝试添加方法隐藏并尝试并调用它像_('#menu').hide();时,它会抛出错误:TypeError: Object #<HTMLDivElement> has no method 'hide'我误解了什么?为什么这个原型失败?

是的,我没有谷歌这个问题,我只是不明白。一个提示将不胜感激。

+0

它在我看来像你试图调用隐藏的返回值功能。我期望:var x = new _('#menu'); x.hide();去工作,但我不认为这就是你想要的。也许你应该返回一个对象来调用隐藏功能。 – jjrdk 2012-02-10 09:52:58

+0

必须在'hide()'中设置'return' – diEcho 2012-02-10 09:53:41

回答

0

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

你可以使用它作为一个普通的功能,但你需要调用自身的构造函数来创建返回对象,并处理当它作为一个构造函数:

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属性将是一个元素或一组元素,所以你必须在每次使用它时检查这个...

+0

'hide()';你没有提到 – diEcho 2012-02-10 10:03:45

+1

@diEcho:这部分代码不需要改变。 – Guffa 2012-02-10 10:35:20

+0

谢谢,这只会破坏第一个函数的简单性,因为它不直接返回元素 – jenswirf 2012-02-10 10:41:06

1

构造函数需要返回自身( return this;)。目前它返回一个DOM对象,或者如果没有字符串被传递,则返回 undefined

试试这个:

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(); 
+0

由于该函数被用作普通函数,而不是构造函数,'this'将是全局作用域,即'window'。 – Guffa 2012-02-10 10:08:48

+0

我以前的回答很差。我又去了一次。 – osahyoun 2012-02-10 10:15:24

+0

你可以直接调用构造函数'_('myDivID')',它会返回一个'_'的实例,我认为这是你想要的。比不得不调用它好得多:'el = new _('myDivID');' – osahyoun 2012-02-10 10:17:38

-2

尝试定义你这样的功能:

var _ = function (e) { }; 

编辑 而是的,别忘了当然返回this

+0

没有必要这么做 – diEcho 2012-02-10 09:53:16