建立对象及原型的使用

1.面向对象的三大特性

  • 封装
  • 继承
    本身没有的,拿别人过来用,就是继承
  • 多态
    父类引用指向子类的对象(JavaScript中用不到)

2.建立对象的四种方式

  • 使用字面量建立对象函数

    var o = {key:value, key:value...}

    用一个建立一个,不能复用,形成代码冗余,资源浪费this

  • 使用内置构造函数建立对象prototype

    var o = new Object();
       var o = new Array();

    建立出来的对象都是空的对象,要手动的去为对象添加属性。形成代码重复调试

  • 封装简单的工厂函数(不推荐使用)code

    function createObj(){
         var obj = {};
         obj.xx=xxx;
         return obj;
    }
  • 自定义构造函数
function 构造函数名{
    this.xxx=xxx;
    //....
}

1.构造函数名首字母要大写
2.构造函数通常和new关键字一块儿使用
3.构造函数返回值默认为新建立好对象 若是手动返回基本数据类型,不影响默认返回值,若是返回的是对象,那么新建立出来的对象将不会返回,取而代之的是return后面的对象对象

构造函数(constructor)的执行步骤
1.使用new关键字建立对象
2.调用构造函数,将new建立出来的对象赋值给构造函数内的this
3.使用this给新建立出来的对象增长成员
4.默认返回新建立出来的这个对象继承

原型

构造函数存在问题

构造函数中的方法,每新建立一个对象的时候,该对象都会从新的建立一次这个方法,每一个独享独占一个方法
可是该方法内容彻底相同,因此形成资源浪费ip

1.解决办法1
将构造函数内的方法,进行提取,放在构造函数外面,在构造函数内部进行引用赋值
那么建立出来的对象,都会指向构造函数外面的这个函数,达到共享的目的
问题:全局变量增多,形成全局变量污染,代码结构混乱,不容易维护资源

2.解决办法2
使用原型原型

3.原型

原型是什么?

在构造函数建立出来的时候,系统会默认的建立并关联一个对象,这个对象就是原型,原型对象默认是空对象
默认的原型对象中会有一个属性constructor指向该构造函数

原型的做用

原型对象中的成员,能够被使用和它关联的构造函数建立出来的全部对象共享

原型对象的使用

  1. 使用对象的动态特性,为原型对象添加成员
  2. 直接替换原型对象

注意事项:

直接替换原型对象,会致使替换以前建立的对象的原型和替换以后建立的对象的原型不一致

原型的使用该注意事项

1.使用对象访问属性的时候,会如今对象中查找,若是找到了就直接使用
若是没有找到,就去原型中查找
2.使用对象设置属性的时候,只会在对象自己中查找,不会去原型中查找,若是在对象自己中没有找到这个属性
则给该对象新增一个属性,若是在对象中有这个属性,修改这个属性
3.若是在原型对象中有引用类型的属性,那么使用对象进行修改该属性内容,则其余全部跟这个原型对象相关的对象都会受到影响

Person.prototype.car = {};
var p = new Person( );
p.car = {}; //这是修改属性
p.car.brand= ""; //这是修改属性的内容

4.通常状况下不会将属性添加到原型对象中
只会将须要共享的方法,添加到原型对象中

proto

1.这个属性不是标准属性,因此存在通用性问题
2.通常不推荐使用这个属性
3.调试的时候,可使用这个属性
4.这个属性是原型中的属性

替换原型时候的注意事项:在新替换的原型中,没有constructor属性,会影响三角结构关系的合理性so,在新替换的原型中,手动添加constructor属性,以保证关系的合理性,赋值为关联的构造函数

相关文章
相关标签/搜索