使用JS Classical与实例方法一起工作

时间:2015-07-12 15:33:28

标签: javascript object prototype

我试图分析经典模型的流程,并测试不同的方法,如果它能够发挥作用。首先,我已经实例化ans1然后我尝试将函数ans1.area分配给ans2,认为它会通过引用,但是当我尝试调用area()时在ans2它没有工作 - ans2.area(),是不是应该传递函数的引用?而 当我将ans1分配给ans2并尝试致电ans2.area()时,它与ans1具有相同的值。你能帮忙详细说明吗?谢谢。

  function Rectangle(length,width){

     this.length = length;
     this.width = width;

    }

    Rectangle.prototype.perimeter= function(){

       var perimeterAns = this.length + this.length + this.width + this.width;
       return perimeterAns;

      };

    Rectangle.prototype.area= function(){

          var areaAns = (2*this.length + 2*this.width);
          return areaAns;

      };


    var ans1 = new Rectangle(5,6);
    ans1.area(); // 22

    // not working
    var ans2 = ans1.area
    ans2(); // Nan

    ans2 = ans1;
    ans2.area(); // 22;

3 个答案:

答案 0 :(得分:4)

那是因为#include <iostream> #include <boost/asio.hpp> using namespace boost::asio; int main() { io_service service; std::string str = std::string("HTTP/1.1 200 OK\r\n ......"); ip::tcp::acceptor my_acceptor{ service, ip::tcp::endpoint(ip::tcp::v4(), 6767) }; ip::tcp::socket my_socket{ service }; my_acceptor.async_accept(my_socket, [&my_socket, &str](boost::system::error_code ec) { if (ec) { std::cerr << "Oops: " << ec.message() << "\n"; } else { std::cout << "connected " << std::endl; async_write(my_socket, boost::asio::buffer(str), [&my_socket](boost::system::error_code ec, std::size_t) { if (ec) { std::cerr << "Oops: " << ec.message() << "\n"; } else { std::cout << "Data written" << std::endl; } }); } }); service.run(); } 变量仅仅引用了.cpp, .cc, .cxx, .c++, .cp函数,但缺少其原始的上下文(这是ans2引用的对象变量)。因此,函数中的area实际上是ans1(全局上下文),由于值无效,最终会导致this

您可以使用window将函数绑定到原始上下文:

NaN

或者

bind

请参阅MDN

答案 1 :(得分:2)

当你执行var ans2 = ans1.area; 时,你已经为ans2分配了一个函数。因此,当您调用 ans2.area()时,不会引用 Rect 对象,它会引用全局对象,它不会t具有长度宽度属性。

请参阅Custom Objects,了解其在JavaScript中的工作原理

答案 2 :(得分:2)

正如您在function area中看到的那样,请lengthwidth变量的访问方式(使用this) - 这意味着访问{{1}来自您希望执行操作的对象的变量。

现在回答您的第一个问题,请参阅我的答案内联 length and width

第二个问题,找到我的答案内联 // not working var ans2 = ans1.area // Copy the function area to a variable ans2(); // Nan // here when you call the function, this object points to //global object where length and width is undefined

`