JavaScript prototype

原型是什么

在 JavaScript 中,prototype 是函数的一个属性,每个函数中都有一个prototype属性,函数的原型为对象。它主要在函数用作构造函数时使用。

1
2
3
function Person(){
}
console.log(Person.prototype);//Object

由于prototype属性包含的是一个对象,所有我们可以这样为原型上添加属性方法

1
2
3
4
5
6
function Person(){
}
Person.prototype.name = "zhou";
Person.prototype.sayName = function(){
console.log(this.name);
}

也可以这样

1
2
3
4
5
6
7
8
function Person(){
}
Person.prototype = {
name : "zhou",
sayName : function(){
console.log(this.name);
}
}

JS中apply与call的用法

ECAMScript 3给Function的原型定义了两个方法,它们是Function.prototype.call和Function.prototype.apply。
call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向
call 和 apply二者的作用完全一样,只是接受参数的方式不太一样。

方法定义

apply

Function.apply(obj,args)方法能接收两个参数:
obj:这个对象将代替Function类里this对象
args:这个是数组或类数组,apply方法把这个集合中的元素作为参数传递给被调用的函数。

javascript自执行函数

起因,今天在豪大大的JS开发群里有人问了一道题,

1
2
3
4
5
6
7
8
9
10
11
12
var test=(function(a){
this.a = a;
return function(b){
return this.a.e + this.a.f + b;
}
}(function(a,b){
return{
e:a,
f:b
};
}(1,8)));
console.log(test(4));

对此有点似懂非懂,于是就查阅了一番。
( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,然后再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来查看资料发现并非如此。要理解立即执行函数,需要先理解一些函数的基本概念。
函数声明、函数表达式、匿名函数,立即执行函数