在Javascript面向对象编程中,定义实例方法主要有两种:
- 通过this变量定义
- 通过prototype定义
function Student(name){
var name = name;
function privateFunc(){
console.log("This is a private fucntion");
}
this.showName = function(){
privateFunc();
console.log(name);
}
}
Student.prototype.protoFunction = function(){
//console.log(name);
privateFunc();
}
var stu = new Student("Jim")
stu.showName();
stu.protoFunction();
通过this与prototype定义的方法有什么区别呢?
运行以上代码可以发现,showName方法可以访问类函数中的定义的变量与方法,而protoFunction只能访问showName方法。
如果将protoFunctionin定义在构造函数内部,就可以访问这些属性和方法了。但作为实例函数,如果定义在构造函数内部,每次实例化都要执行,显然在浪费内存,也不合理。
有些资料上把this.showName这类方法叫做特权方法,主要是为了访问内部的私有字段,这样就可以控制对某些字段的访问。
而protoFunction这类方法相当于类的实例方法,但能访问这些特权方法,间接访问私有字段。
结论: 如果要直接访问私有字段,应该使用特权方法,也就是this定义的方法,应该定义在构造函数内部。相反,如果不需要直接访问私有字段,应该使用prototype定义的方法,而且应该定义在构造函数外部。