1. 构造函数法
function Person(name) {
var name = name
this.sayName = function () {
console.log(name)
}
}
var person1 = new Person('ss')
person1.sayName() //ss
var person2 = new Person('bb')
person2.sayName() //bb
console.log(person1.sayName == person2.sayName) //false。每个实例的同名方法都要重新创建。
2. 原型访问
function Person(name) {
var name = name
Person.prototype.sayName = function () {
console.log(name)
}
}
var person1 = new Person('ll')
person1.sayName() //ll
var person2 = new Person('bb')
person2.sayName() //bb
console.log(person1.sayName === person2.sayName) //true。每个实例的方法都是动态共享的。但每个实例都没有自己的私有变量。
私有变量若痛过原型方法访问,私有变量就是动态共享的;若通过实例方法访问,私有变量在每个实例中都有其特异性。而实例属性不同,实例属性将覆盖同名原型属性,且永远是特异性的。
3. 模块模式
前面的方法都是为自定义类型创建特权方法,而模块模式是为单例创建特权方法。
var person = function () {
var name = "Bob"; //私有变量
function privateFunction() { //私有函数
console.log('私有函数')
};
return {
publicName: name, //特权属性
publicMethod: function () { //特权方法
privateFunction();
}
}
}();
console.log(person.publicName)//Bob
person.publicMethod() //私有函数