首先大家需要先明白几个概念,我也是踩过几个坑才发现构造函数并不是我们所想的那么简单的,
公有属性:就是构造函数的时候this所指向的那个属性,这是为了让所有实现这个构造函数的实例都能有的属性;
公有方法:同上。
私有属性:就是构造函数中通过var xx;所声明的那个属性,为何叫私有呢,因为他是在构造函数所在的作用域内声明的,因此叫做私有;
私有方法:同上私有属性的理解;
静态属性和静态方法):通过调用 构造函数名.xxx 实现的属性和方法,这个方法区别于私有属性和方法的最大区别就是这静态的不能被实例所拥有,但是私有却可以能被拥有。
对照着demo,自己去理解吧!其实这个很简单的,就是我们的每一个函数其实都是一个Function的实例,既然这样,实例对象当然可以给自己添加属性和方法了,所以又叫做“类属性”、“类方法”,所以构造函数自己本身所具有的类属性和类方法肯定不在原型上啊,也肯定是不能被实例所实现的了。
ps:前几天开发中遇到一个小问题,搞了半天是自己对作用域链有误解:每个函数都有自己的作用域,运行的时候都会产生各自的作用域链,而构造函数呢,当我们构造新对象的时候,构造函数把自己的作用域赋给了新对象,如果我们在构造函数中调用新对象作用域内的变量是不可能访问到的!!!
ps:http://blog.csdn.net/zzulp/article/details/8144520
http://www.cnblogs.com/jikey/archive/2011/05/13/2045005.html
给个demo:function my(msg){
this.myMsg = msg; //只在被实例化后的实例中可调用
var age = 29;
function aged(){
alert(that.name);
}
this.sayAge = function(){
alert(age); //在公有方法中可以访问私有成员
}
}
myObject.prototype.sayHello = function(){
alert('hello everyone!');
}
my.name = 'china';
//静态方法
my.alertname = function(){
alert(this.name);
}
//实例化
var m1 = new my('111');
理解构造函数的几种方式没必要多说,理解以及用好了组合构造函数就够了,不过这里有一点需要提醒自己,就是高级技巧,特别是在单例模式和构造函数的方法的时候有用,还有以防构造函数被全局window。直接调用!!
ps;其实所谓的构造函数私有变量,不就是和形参数是一样的吗?所谓的额构造函数的静态方法,即是构造函数作为一个Function的实例的自己的变量方法吗!!
而且js中每次调用同一个函数都会生成独一无二的作用域链,因为我们调用函数的上下文信息是不对称的。。。