使用prototype属性定义Javascript函数

时间:2012-09-27 10:01:22

标签: javascript

这段代码出了什么问题?

(function (){
    'use strict';

    // add hasClass function
   String.prototype.hasClass = function (className) {
       return this.className.search('(\\s|^)' + className + '(\\s|$)') != -1 ? true : false;
   };

   console.log(document.getElementById('link').hasClass('test'));    
})();

我希望它会返回truefalse,但我得到的只是

TypeError: document.getElementById("link").hasClass is not a function**

UPD:谢谢你们。现在我懂了。我应该将方法设置为Object或Element(更正确的是什么?)而不是String!

3 个答案:

答案 0 :(得分:4)

document.getElementById('link')不返回String,它返回一个DOM元素。您可以尝试这样做: -

 Element.prototype.hasClass = function (className) {
       return this.className.search('(\\s|^)' + className + '(\\s|$)') != -1 ? true : false;
   };

   console.log(document.getElementById('link').hasClass('test'));   

答案 1 :(得分:1)

据我所知,hasClass不是Element的方法,你可能会想到jQuery方法,因此你必须使用jQuery并使用jQuery选择元素选择。其他框架也可能有这样的方法,我相信YUI也是如此。

答案 2 :(得分:1)

执行此操作的方法是编写一个接收DOM元素的函数,因为String对象与它无关;)

一个简单的例子:

function hasClass(element, classcheck){
  return element.className.indexOf(classcheck) !== -1;
}

所以你的代码看起来像是:

(function (){
    'use strict';

    // add hasClass function
    function hasClass(element, classcheck){
      return element && element.className && element.className.indexOf(classcheck) !== -1;
    }

   console.log(hasClass(document.body,'test'));
})();

显然,你应该检查第一个参数实际上是一个DOM元素(实现它的方法很多),但这是正确的方法。