对原型链、闭包的理解

1.原型链:

 理解: js在创建对象(不论是普通对象还是函数对象)的时候,都有一个__proto__的内置属性,指向创建它的函数对象的原型。

 示例:

    val  cat  =  new  Animal();

    实例对象cat有一个__proto__属性指向Animal的原型对象,

    即:cat.__proto__   ===  Animal.prototype;

               同样,Animal.prototype也有一个__proto__属性指向创建它的函数对象(Object)的原型。

       即: Animal.prototype.__proto__   ===   Object.prototype

    继续,Object.prototype也有一个__proto__属性,但它比较特殊,为null

    即: Object.prototype.__proto__    ===   null

 结论: 

  我们把这个由__proto__串起来的直到Object.prototype.__proto__为null的链叫做原型链。
 
  另:每一个函数对象的原型对象还有一个constructor属性指向该函数对象本身。
 
2.闭包
  理解:
    a.闭包是一种程序结构,即内部函数能够引用外部函数的参数和局部变量,当外部函数返回内部函数时,相关参数和变量都保存在返回的函数中。
    b.闭包是js为对象创建私有变量的一种方式。
  使用闭包时需要注意的点:
    返回函数不要引用任何循环变量,或者后续会发生变化的变量。如果非要引用循环变量,方法是创建一个函数,用该函数的参数绑定循环变量。
    
function count() {
    var arr = [];
    for (var i=1; i<=3; i++) {
        arr.push((function (n) {
            return function () {
                return n * n;
            }
        })(i));
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];

f1(); // 1
f2(); // 4
f3(); // 9

  上例如果不使用自执行函数,则f1(),f2(),f3()返回的结果都是16;

    
 
posted @ 2018-02-12 16:46  尹言覃少  阅读(447)  评论(0编辑  收藏  举报