zoukankan      html  css  js  c++  java
  • 突然奇想

    javascript是一种动态语言,不管你是否接受,它就是这样的,有些东西你必须接受它,才可以享受它提供的服务。

    看书籍看的多了,也渐渐有了自己的看法。

    Javascript在对象生成后,可以任意给该对象添加属性或者方法。

    var o = {}; // 我发现了一个东西。

    o.eat = function(){return "I am eating."}  // 我发现它会吃;

    o.sleep = function(){return "ZZZzzz..."} 

    // 我发现它会睡;

    o.talk = function(){return "Hi!"} // 我发现它会说话;

    o.think = function(){return "Hmmm..."} // 我发现它还会思考。

    var Human = new Function(); // 我决定给它起名叫“人”。

    Human.prototype = o; // 这个东西就代表了所有“人”的概念。

    var h = new Human(); // 当我发现其他同它一样的东西,

    alert(h.talk()) // 我就知道它也是“人”了!

    上面这个代码足可以说明这些。

    javascript本身没有类,但是我们在经典的OOP中知道,有了类才可以有对象。看过《悟透Javascript》这本书的话,可以知道在 JavaScript 中,用 new 关键字创建对象是执行了下面三个步骤的:

    1. 创建一个新的普通对象;
    2. 将方法对象的 prototype 属性的所有属性复制到新的普通对象中去。
    3. 以新的普通对象作为上下文来执行方法对象。

    其实这里就利用了继承,集成了函数的方法,这是因为在Javascrit中,函数具有波粒二象性的,既可以当做对象使用,又可以当做方法去执行,其实也就是Call和Apply这两个玩意儿。

    如果说第二步是为了继承函数的方法,那么第三步也是很关键的,Javacript中有作用域的概念,也就是上下文,这里牵扯到一个this,在Java等语言中this有明确的含义,就是当前类的当前对象,而Javascript中,这个玩意不确定,这一点需要注意。

    我感觉才开始的时候this指的就是Window的作用域,当我们定义一个函数的时候,这个函数其实也就是在window的上下文中的,不信可以看下面的,这个this在这里就是window。

    var b = function() {
        alert(this.value);
       }
       
       b();
       
       window.b();
    

     因为call和apply这两个函数是函数的一个方法,只是apply和call的参数不一样,前者是一个数组,而后者是一个参数列表,函数就是通过这两个方法来改变内部的this的。

    <script type="text/javascript">
       
       var b = function() {
        alert(this.value);
       }
       
       b();
       
       window.b();
       
       var b1 = {value:"this is b1"};
       
       var b2 = {value:"this is b2"};
       
       b.call(b1);
       
      </script>
    

     当调用了call方法或者apply方法,那么相当于将函数附加到b1这个对象上了。

    看到这些,感觉Javascript里面都是动态的,当调用了apply或者call的时候,不知道内部是不是将这个函数动态添加到这个新的对象上了,b1本身没有b这个函数,自然不能调用,而用了这两个方法后,相当于执行了b1.b(),那么这个时候的this指向的就是b1了,从这里可以看出this始终指向当前的作用域对象。在调用apply和call的时候只是更改了作用域而已。

    上面的是个人观点,欢迎讨论!

  • 相关阅读:
    模拟赛总结
    2018.04.06学习总结
    2018.04.06学习总结
    Java实现 LeetCode 672 灯泡开关 Ⅱ(数学思路问题)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 670 最大交换(暴力)
    Java实现 LeetCode 670 最大交换(暴力)
    Java实现 LeetCode 670 最大交换(暴力)
  • 原文地址:https://www.cnblogs.com/zuiyirenjian/p/2991353.html
Copyright © 2011-2022 走看看