面向对象三大基本特性是封装,继承,多态。封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。Javascript中除了null和undefined一切皆对象,我们要把属性和方法封装成一个对象,甚至抽象成一个类来重复利用的时候就可以用到下面几个方法了
封装的实现方式
- 单例模式
创建方式:
var person1 = {
name: '张三',
age: 11
}
var person2 = {
name: '李四',
age: 22
}
缺点:产生大量的重复代码
- 工厂模式
创建方式:
function person (name, age) {
return {
name: name
age: age
}
}
var person1 = person('张三', 11)
var person2 = person('李四', 22)
优点:减少了重复的代码
缺点:不能识别对象
- 构造函数模式(constructor)
创建方式:
function Person (name, age) {
this.name = name
this.age = age
this.say = function () {
console.log(123)
}
}
var person1 = new Person('张三', 11)
var person2 = new Person('李四', 22)
优点:可以识别对象constructor
缺点:每个方法都会在实例上创建
- 原型模式
创建方式:
function Person () {}
Person.prototype.name = name
Person.prototype.age = age
Person.prototype.say = function () {
console.log(123)
}
var person1 = new Person('张三', 11)
var person2 = new Person('李四', 22)
优点:所有实例共享属性和方法
缺点:共享引用类型的数据问题
- 构造函数+原型
创建方式:
function Person (name, age) {
this.name = name
this.age = age
}
Person.prototype.say = function () {
console.log(123)
}
var person1 = new Person('张三', 11)
var person2 = new Person('李四', 22)
下面为简单的类和实例的关系
obj.png原型模式的验证方法
- isPrototypeOf(): 判断某个proptotype对象和某个实例之间的关系
Person.prototype.isPrototypeOf(person1)
- hasOwnProperty():判断某一个属性到底是本地属性还是继承自prototype对象的属性
person1.hasOwnProperty('name')
- in:判断某个实例是否含有某个属性,包含本地和prototype的所有属性
'name' in person1
后面会继续总结继承和多态~
网友评论