JS 封装 - 83015010/js GitHub Wiki
参考资料:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html
一、构造函数实现对象的封装
//定义一个人的构造函数
function Person(name,age) {
this.name = name;
this.age = age;
}
var zhangsan = new Person('zhangsan',22);
var lisi = new Person('lisi',25);
1.1 构造函数中的this指向函数的实例对象
1.2 每一个实例对象都有一个constructor属性,它指向函数本身
console.log(zhangsan.constructor == Person); // true
console.log(lisi.constructor == Person); // true
1.3 构造函数的prototype属性
我们可以将某个原型对象的共同属性挂在prototype上,这样每一个实例对象都会拥有该属性。
//定义一个人的构造函数
function Person(name, age) {
this.name = name;
this.age = age;
}
//假设每个人都有说话的能力,做自我介绍
Person.prototype.speak = function () {
console.log('我叫: '+this.name+' , 我今年: '+this.age+'岁');
}
var zhangsan = new Person('zhangsan', 22);
var lisi = new Person('lisi', 25);
//每一个实例对象都拥有了speak方法
zhangsan.speak();
lisi.speak();
输出:
我叫: zhangsan , 我今年: 22岁
我叫: lisi , 我今年: 25岁
1.4 prototype的一些方法
1.4.1 isPrototypeOf()
这个方法用来判断,某个proptotype对象和某个实例之间的关系。
console.log(Person.prototype.isPrototypeOf(zhangsan)); //true
console.log(Person.prototype.isPrototypeOf(lisi));//true
1.4.2 hasOwnProperty
每个实例对象都有一个hasOwnProperty()方法,用来判断某一个属性到底是实例对象自己的属性,还是继承自prototype对象的属性。
console.log(zhangsan.hasOwnProperty('name'));//true
console.log(zhangsan.hasOwnProperty('speak'));//false
1.4.3 in 运算符
in运算符可以用来判断,某个实例是否含有某个属性,既包含实例对象自己的属性,也包含prototype继承的属性。
所以使用in遍历对象的时候,得到的是该对象的所有属性