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;