1.一个构造函数如下:(构造函数规范是首字母大写,内部使用this定义属性方法)
function Person(){
this.name='a';
this.job={s:'e'};
this.func=function(){return 'eee';}
};
var a1 = new Person();
console.log(a1);
a1.job.s='t';
var b1 = new Person();
console.log(b1);
以上代码构建了一个类Person,创建了两个他的实例,其中一个实例修改job对象,然后新建b1输出,b1的job是什么呢,答案是{s:'e'};
所以构造函数Person并没有受到实例的影响。
可以使用prototype来放需要做公共属性的内容,(常说的原型指的就是A.prototype),例子如下:
function Person(){this.name='a';
this.job={s:'e'};
this.func=function(){return 'eee';}};
Person.prototype.aa = {e:'r'};
var a1 = new Person();
console.log(a1);
a1.aa.e='t';
var b1 = new Person();
console.log(b1.aa);
//b1.aa输出{e:'t'};
因为prototype是公共属性容器,所以实例均可修改其中的属性内容,b1访问属性aa,已经被a1修改过了。
2.闭包:
闭包是指有权访问另一个函数作用域变量的函数,创建闭包的通常方式,是在一个函数内部创建另一个函数。
function A(){
var x = 1;
return function(){
x++;
console.log(x);
}
}
var m1 = A();//第一次执行A函数
m1();//2
m1();//3
var m2 = A();//第二次执行A函数
m2();//2
m1();//4
返回的函数使用了A()的变量,所以变量不会被回收,保留在内存中,下次调用返回的函数就会返回x的加一结果了;
新运行A()返回新的对象,所以两个m1,m2并不会相互影响。