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