[TOC]
2016年4月28日
javascript
javascript原型与闭包
function Fn() { }
Fn.prototype.name = '王福朋';
Fn.prototype.getYear = function () {
return 1988;
};
var fn = new Fn();
console.log(fn.name);
console.log(fn.getYear());
Fn是一个函数,fn对象是从Fn函数new出来的,这样fn对象就可以调用Fn.prototype中的属性。
因为每个对象都有一个隐藏的属性:“__proto__”,这个属性引用了创建这个对象的函数的prototype。即:
fn.__proto__ === Fn.prototype
函数与对象之间,不仅仅是一种包含和被包含的关系,函数和对象之间的关系比较复杂,甚至有一点鸡生蛋蛋生鸡的逻辑。
Object 和 Array 都是函数:
console.log(typeof (Object)); // function
console.log(typeof (Array)); // function
**每个函数都有一个属性叫做prototype。**
这个prototype的属性值是一个对象(属性的集合,再次强调!),默认的只有一个叫做constructor的属性,指向这个函数本身。
![](img/proto.jpg)
>每个对象都有一个__proto__属性,指向创建该对象的函数的prototype。
>>**Object.prototype是一个特例——它的__proto__指向的是null,切记切记!**
####Instanceof运算符
Instanceof运算符的第一个变量是一个对象,暂时称为A;第二个变量一般是一个函数,暂时称为B。
Instanceof的判断队则是:沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false。
![](img/prototype.png)
####继承
访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。
**hasOwnProperty()**对自身的属性会返回true,原型链上的属性会返回false。这个方式是Function.prototype继承自Object.prototype的方法。
###数组
####Array对象的静态方法
- isArray方法
Array.isArray方法用来判断一个值是否为数组。
```js
var a = [1, 2, 3];
typeof a // "object"
Array.isArray(a) // true
valueOf方法返回数组本身。
var a = [1, 2, 3];
a.valueOf() // [1, 2, 3]
toString 方法返回数组的字符串形式。
var a = [1, 2, 3];
a.toString() // "1,2,3"
var a = [1, 2, 3, [4, 5, 6]];
a.toString() // "1,2,3,4,5,6"
push方法用于在数组的末端添加一个或多个元素,并返回添加新元素后的数组长度。注意,该方法会改变原数组。
var a = [];
a.push(1) // 1
a.push('a') // 2
a.push(true, {}) // 4
a // [1, 'a', true, {}]
pop方法用于删除数组的最后一个元素,并返回该元素。
var a = ['a', 'b', 'c'];
a.pop() // 'c'
a // ['a', 'b']
[].pop() // undefined
join方法以参数作为分隔符,将所有数组成员组成一个字符串返回。
var a = [1, 2, 3, 4];
a.join(' ') // '1 2 3 4'
a.join(' | ') // "1 | 2 | 3 | 4"
a.join() // "1,2,3,4"