2016年4月28日

[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方法,toString方法

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(),pop()

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(),concat()

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"

Last updated