1.面向对象的特征:封装,继承,多态
1.1 封装性:将复杂包裹起来,让简单的东西留在外面
1.2 继承性:拿来主义,自己没有,把别人的额拿过来,成为自己的
1.3 多态性:简单来讲就是给父类调用方法,由绑定在父类的子类实现(在javascript里面不考虑这个问题)
js中有两种继承模型:组合继承和原型继承
(1)组合式继承:就是将其他的对象中的成员加到自己身上
// 将 o1 的成员加到 o2 上
// for ( var k in o1 ) {
// o2[ k ] = o1[ k ];
// }
(2)
原型式继承:对象继承自原型对象,原型式就是在对象的原型对象(链)中加东西就可以了,
优点:共享方法,节约内存
缺点:增加链式搜索的负担(消耗性能)
3.如何使用原型对象继承
<1>利用对象的动态特征添加成员
Person.prototype.sayHello = function () {
alert (' 哈哈哈 ')};
<2>利用覆盖原型对象
// 如果需要添加的内容非常多
var Person = function() {};
var p = new Person();
console.log( p.constructor.name );//=>打印出来是空的,
//因为function这个函数没有名字
// function Person() {}
Person.prototype = {
// constructor: Person,
//需要添加一个constructor属性,就不会被覆盖了
sayHello: function() {},
sayGoodbye: function() {},
sayLove: function () {}
};
// 这里由 Person 创建出来的对象什么类型?
// Object
// 为什么? 合理吗?
//找到object类型的原因:.name属性的找顺序:p的原型对象里找(因为constructor属性在它的原型对象那里,)
//原型对象没有,就到原型对象的原型对象中找,所以找到了object类型
//所以,当添加了constructor属性之后就是Person类型了
(覆盖原型对象实现继承的时候,一定要给新对象添加一个constructor属性(这样就不会覆盖掉了),以便模拟对象的类型,但是如果对对象的类型要求不严格可以忽略)
<3>利用组合式继承添加原型成员
/给o2的原型原型对象添加o1里面的属性和方法
// fn.prototype.extend=function(obj){
// for(var k in obj){
// this[k]=obj[k];
// }
// };
4. Object.creat
1.5.1 Object.create(对原型继承的使用)(间接继承)
如果实际开发中,希望或的一个继承自对象o 的对象,可以使用Object.create方法小写的object不存在。
ES5提供的方法
var o1 = { name: 'jim' };
var o2 = Object.create( o1 );
5. Object与其他对象之间的关系
原型对象也有原型对象,对象的原型对象一直往上找,会找到一个null,在这个过程中,会有一个Object类型的,它就是Object.prototype
要求:看到一个对象就知道他的原型链式什么样子的
Var arr=[];
Arr——>Array.prototype——>Object.prototype——null
Var 0={};
O——>Object.prototype——>null