面向对象和面向过程是程序员经常使用到的思想,必须要深刻理解才好的呀。
面向对象思想
面向过程:亲力亲为,有些代码顺序不可改变,执行者;
面向对象:管理者,在解决问题时首先看是否有对象可以解决,如果有就使用该对象解决问题。
面向对象:实质是找一个对象帮你解决问题,如果没有此对象,就可以考虑自己封装一个。
优点:可维护性;可扩展性;
缺点:在使用面向对象编程时,会造成代码的复杂度提高。
原型
原型指函数的prototype属性所引用的对象
Person.prototype.sayHi = function(){
console.log('hi');
}
- 只要定义一个函数,那么就会创建其原型
- 由上述函数创建出来的所有对象,都可以直接访问到原型上的成员
作用:实现同类对象之间的数据共享,可以动态添加属性并共享,另一个重要作用是继承。
获取原型方式
通过函数:.prototype
通过对象:._proto_
以两个下划线开头和结尾的属性均为非标准属性;原型上默认具有constructor属性,引用的就是其构造函数。兼容__proto__写法:
function getPrototype(obj){
return obj.__proto__?obj.__proto__:obj.constructor.prototype;
}
特性:
动态性
在已有的原型上扩展成员,直接反映到已创建出来的对象上。
如果置换了已有的原型,那么会反映到后面新创建的对象,而不会影响之前创建的对象。
唯一性
由同一个构造函数创建出来的所有对象,都共享一个原型。
不可变性
不能通过对象来修改原型上的成员。
共享性
所有的对象都可以直接访问其原型上的成员。
扩展创建对象方式
原型式
组合方式创建对象(原型和构造函数)
组合原型和构造函数一起来创建对象
将私有的属性写在构造函数内
将共有的属性或行为写到其原型上
继承
指一个对象有权去访问另一个对象上的成员(属性和方法)
实现:
原型式继承
a: 在原有的原型上扩展
b: 置换原型
混入式:将要继承的对象上的所有成员拷贝一份,添加到本身。
Object.create方法
实现原型式继承(通过置换原型方法)
var newObj = Object.create(parent);
- Object.prototype的原型为null
- 默认原型对象的原型为Object.prototype
扩展继承方式---对象冒充
function parent(name,age){
this.name = name;
this.age = age;
}
function child(name,age,gender,address){
this.parent = parent;
this.parent(name,age);
delete this.parent;
this.gender = gender;
this.address = address;
}
var newObj = new child('tom', 18, 'boy', 'beijing');
console.log(newObj);
```
- 局限性:不能指定构造函数。
### 属性搜索原则
+ 当访问对象的某个属性时,
+ 首先在对象本身上查找,如果找到就返回值,并停止查找;
+ 如果没有找到就会向其原型对象上查找,如果找到就返回值,并停止查找;
+ 如果再没有找到,就继续向其原型的原型对象上查找,直到Object.prototype(不会到Null),此时如果找到就返回值,否则值为undefined(如果找不到方法的原型对象的属性,则会报错)。
好了,这次就先说这么多了,之后会一一补充起来的,gogogo!