7天入门JavaScript,第五天

对象
  JavaScript 中除了数字,字符串,布尔值,null和undefined之外都是对象。

对象分类
  内置对象:数组 ,函数 , 日期 , 正则表达式...
  宿主对象: window ...document...(也可以看作内置对象)
  自定义对象,

创建对象
  对象字面量方式:
    var object = {id:1,name:'xxx',walk:function(){}};
  new 构造函数
    var object = new Object();
    自定义的构造函数,它的原型是Object
    function fun() {

    }
    //fun.prototype = Function;
    alert(typeof fun.prototype); // object

  Object.create();

-------------------------------------------

  function fun() {

  }

  alert(fun); // 这个fun指的是 fun 对应的function对象
  alert(fun()); // 这个 fun() 只得是调用fun之后的返回值
  alert(new fun()); //这个是调用fun构造函数 返回fun构造函数创建的对象

  function fun() {
    age = true;  // 如果不加this,它就是全局的 // 如果后面声明了var age 那这个就是局部变量了,因为函数的作用域会将所有var"提前"
    this.age = "fun";
    //var age = 123;
  }
  alert(new fun().age);    
  alert(age);

---------------------------------------------------------------------------------

prototype  
  function fun() {
  }
  上面这段代码 等同于 var fun = new Function();  fun.prototype = new Object(); (prototype 是function对象的属性,不是自定义函数创建的对象的属性)
  这句话,本质是创建了一个fun的function对象。就像类加载之后创建了这个类的class对象一样。这里的function对象等同与class对象。
  原型是fun的function对象的一个属性。所以所有的xxx产生的对象都出自同一个function对象,那么也就共享同一个prototype属性。
 
  如果不用原型会有什么问题?
  每一次创建一个对象,如 var f1 = new fun(); var f2 = new fun(); fun里面的字面量,都会重新计算(重新构造对象,因为在javascript里面方法就是对象)。

 方法是可以重用的,但是如果有成员变量那么会造成资源共享问题,只要我们不声明成员变量那么资源共享问题是可以避免的。
  用原型的目的: 把函数当方法,仅仅当方法用, 不当对象用。因为方法没有成员变量一说,只有对象才有成员变量。
 
  原型链上的属性不允许赋值。,只有通过查询属性才会体会到继承的存在

fun2.prototype.birth = "abc";
    alert(new fun2().birth);
    var fo = new fun2();
    alert(fo.birth);
    fo.birth = "xxxxx";  // 不能赋值给原型链上的birth属性,
    var fo2 = new fun2();
    alert(fo2.birth); // abc



---------------------------------------------------------------------------------
  JSON.stringify(o); 将o对象转为string类型
  JSON.parse(""); 将string转称对象类型

---------------------------------------------------------------------------------

  (function() {
        alert("hi");
  }());
  匿名函数,外面一定要包一层括号。
test();
  function test() {
      var xxx = function() {  // 这种方式不会报错。 赋值语句,后面的function会执行
        alert("hello");     
    }();
        function() {  //声明语句
        alert("www");    
    }();
  }



闭包
  原理,每次调用JavaScript函数时,都会为之创建一个新的对象用来保存局部变量,把这个局部变量保存到作用域链中。
  如果有嵌套函数并在这个作用域链中,这个嵌套函数可以访问那个保存局部变量的对象。

  var increment = (
      function() {
        var count = 0;
        return function() {
            return ++count;
        }
     // 理解为在这里执行的嵌套函数 }() );
for(var i=0;i<10;i++) { document.writeln(increment()); // 理解为,这个嵌套函数在声明之后下一行执行。 };
原文地址:https://www.cnblogs.com/shouwangzhe-/p/3945088.html