Javascript:Prototype对象不是函数

时间:2015-06-17 19:12:18

标签: javascript function object prototype

希望有人可以帮助我使用我的代码。

JavaScript的:

function myFrame(id){
   if (id) {
      if (window === this) {
         return new myFrame(id);
      }
      this.e = document.getElementById(id);
      return this;
   } else {
      return "";
   }

}

myFrame.prototype = {
    math: function () {
        alert(1 + 1);
    },
    hide: function () {
       this.e.style.display = 'none';
       return this;
    }
}

HTML:

<p id="hideParagraph">Hide Paragraph</p>
<input type="button" name="math" onclick="hide()" value="Hide Paragraph" />
<input type="button" name="math" onclick="math()" value="Alert Math" /> 


<script type="text/javascript">

    function math() {
        myFrame("body").math();
    }

    function hide() {
        myFrame("hideParagraph").hide();
    }

</script>

上面的代码工作正常,但我想知道有没有办法不指定元素。

例如,我需要指定&#34; body&#34; 或其他一些字符串值才能使此代码正常工作,否则我得到&#34;不是功能&#34; 错误消息

myFrame("body").math();

有没有办法让我有这样的代码:

myFrame().math();

并且仍然使用&#34;隐藏&#34; 方法,如:

myFrame("hideParagraph").hide();

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:0)

问题是你的

return "";

尝试:

return this;

答案 1 :(得分:0)

也许这会帮助您理解您的问题:

function Thing(val) {
  this.val = val;  
};

Thing.prototype.alert = function() {
  alert(this.val);  
};

function start(val) {
  return new Thing(val);
}

start("Hi").alert();

您想要一个带有alert方法的类,然后在外部函数中创建该类的新实例。

可能有很多方法可以做到这一点。使用此设置,您可以多次拨打start

答案 2 :(得分:0)

这里的问题是你的返回值。

当您致电myFrame("body")时,您的函数中的window === thistrue,然后调用new myrFrame('body')。当发生这种情况时,你return this;。新创建的对象。这个对象在其原型中包含.math().hide()方法。

另一方面,

myFrame().math();myFrame()未通过if(id)检查,因此只返回''。一个空白的字符串不是myFrame()对象。字符串没有.math()方法。

您需要调整myFrame函数,如下所示:

function myFrame(id){
    // Determine whether we called 'myFrame()` or 'new myFrame()'
    // In "use strict"; (strict mode), do `if(!this)`
    if (window === this) {
        return new myFrame(id);
    }
    else{
        // In here, this is our new myFrame object
        if(id){
            this.e = document.getElementById(id);
        }

        // This return statement isn't actually needed
        // return this;
    }
}

确保始终返回一个对象,无论您传递的参数是什么。