• 【JS复习笔记】02 对象与函数


    好吧,因为很重要的事情,几天没写笔记了。

    关于对象:

    • ||可以用来填充默认值,如:myApp.name || "无"
    • &&可以用来避免错误,myApp.NameObj有某种情况不存在,那么可以用myApp.NameObj && myApp.NameObj.Name避免脚本错误
    • 所有通过对象字面量创建的对象都连接到Object.prototype,当你创建某对象时也可以选择另一个对象作为它的原型,比如:
      if(typeof Object.beget!=='function'){
          Object.create=function(o){
              var F=function(){};
              F.prototype=o;
              return new F();
          }    
      }
      var another_stooge=Object.Create(stooge);

    • delete运算符可以删掉对象的属性,如:delete obj.name
    • 为了减少全局变量的污染,可以创建一个唯一的全局变量对象,所有的全局变量都写在这个全局变量对象里

    关于函数:

    • 对象字面量产生的字面量的原型都是Object.prototype,函数对象连接到Function.prototype.(该原型对象本身连接到Object.prototype)
    • 除了声明时定义的形式参数,每个函数还接收两个附加的参数:this和arguments。this的值取决于调用的模式。
    • JS中有四种调用模式:
      • 方法调用模式
        • 方法定义:如果一个函数被保存为对象的一个属性,那么就被称为方法。
        • 调用的时候this被绑定为该对象。
      • 函数调用模式
        • 就被当做一个函数来调用,this会被绑定为全局对象。
      • 构造器调用模式
        • 如果在一个函数前面带上new来调用,那么背地里会创建一个连接到该函数的prototype成员的新对象
        • 同时this会绑定到那个新对象上
      • Apply调用模式
        • 因为函数就是对象,所以函数也可以拥有方法,也就是Apply方法
        • funcObj.Apply(obj,array),第一个值obj赋值给this,第二个值为参数数组,funcObj为函数对象
    • 实际参数和形式参数的数目不匹配并不会导致错误
    • arguments数组表示实际传进来的参数的数组,说是数组,实际上这是个数组对象,它没有任何数组的方法。
    • 扩充类型的功能:举个栗子:
    • //下面这个是本书添加新函数的方法
      Function.prototype.AddMethod=function(funcName,func){
          this.prototype[funcName]=func;
          return this;
      };
      //根据数字正负来判断使用Math.ceiling还是Math.floor
      Number.AddMethod('integer',function(){
          return Math[this<0?'ceil':'floor'](this);
      })
      document.writeln((-10/3).integer());
    • 作用域的好处在于它可以访问外部函数的参数和变量(除了this和arguments,当然有变通的手法,比如外部函数this或者arguments赋值给外部函数的一个变量)
    • 闭包写法:
      • 你可以用闭包保护name这个变量,从而形成一个类似于私有变量的东西
      • 所谓闭包,简单来讲,就是函数可以访问它被创建时所处的上下文环境。 
        var getMyName=function(){
            var name='Troy';
            return {
                GetName:function(){
                    return name;
                },
                SetName:function(newName){
                    name=newName;
                }
            }
        }();//注意这里两个括号代表,这个最外围的函数被直接执行了,所以getName其实是里面的那个对象
        
        getMyName.GetName();//结果为Troy
        getMyName.SetName("asd");
        getMyName.GetName();//结果为asd
    • 记忆功能实际上算是对递归的一种优化,就是在递归外用个数组样的容器去保存递归的数据。
    • 什么模块啊,柯里化其实就是对闭包的一种扩展,这里就不记录了
    • 一般我们用函数什么的时候可能会用到this,this指向的是最后一个调用此函数的对象。new一个函数对象,this就会指向新的对象。而new的函数对象里,如果return一个对象,那么产生的对象实际上是这个return的对象,this也就指向这个return的对象
  • 相关阅读:
    个人信息
    两个整数的最小公倍数和最大公约数
    java杨辉三角实现
    只会用这简单的递归求阶乘
    图形界面设计
    圆的面积,周长,圆柱体的体积(类的封装与抽象)
    杨辉三角
    1~10的阶乘java语言编程
    个人信息与计算器
    个人信息显示界面
  • 原文地址:https://www.cnblogs.com/vvjiang/p/5143852.html
Copyright © 2020-2023  润新知