
编程思想面向过程分析解决问题所需要的步骤然后用函数把这些步骤一步一步实现使用的时候再一个一个的依次调用面向对象把事务分解为一个个对象然后由对象之间分工与合作面向对象更灵活代码可复用容易维护和开发适合大型项目特性封装性 继承性 多态性构造函数封装是面向对象思想中比较重要的一部分js面向对象可以通过构造函数实现的封装浪费内存构造函数的方法很好用但存在浪费内存的问题如上创建了两个function 实际上是一样的如何解决上面浪费内存的问题呢原型什么是原型目标实现方法共享1.构造函数通过原型分配的函数是所有对象共享的2.js规定每一个构造函数都有一个prototype属性指向**另一个对象**所以我们也称为原型对象3.这个对象可以挂载函数对象实例化不会多次创建原型函数节约内存属性可以写在构造函数身上但方法可以写在原型上这样指向的就是同一个函数构造函数和原型对象里面函数的this指向的都是实例对象constructor属性在哪里每个原型对象都有constructor属性constructor构造函数这个属性指向该原型对象的构造函数如果如下这样写这么写相当于赋值操作里面本来是{constructorf}这样写等于赋值给那个此时prototype以为没有constructor就找不到构造函数了那这样不就违背了原型的设计初衷解决内存浪费所以要加上对象原型有这样一个问题 以构造函数来new出来的实例对象是怎么访问到原型上的属性和方法呢目前来看是这样但是好像实例对象和原型缺了一条线那就是因为实例对象里面会有一个属性__proto__对象原型指向原型对象。浏览器显示是括号显示你自己写代码写的是ldh.__proto__对象原型上也有一个constructor属性指向创建该实例对象的构造函数原型继承继承是面向对象编程的另一个特征通过继承进一步提升代码封装的程度js中大多借助原型实现继承的特性可以看到woman和man的属性是一样的 那能不能提取出来 分别继承那怎么继承通过原型继承这样实例化对象就能通过对象原型来访问到原型但是要注意 上面写法是对原型的覆盖要加上constructor属性但是这样还会有一个问题女人添加的方法男人也会有为什么会这样因为他们继承的对象都是一样的这样你改对象他们指向的是同一个对象所以这么写不合理那怎么解决呢男女分别指向。这样是可以的就是有点麻烦。他们结构一样但是对象不一样构造函数可以解决每次new都是一个新对象原型链重要高频我们已经知道实例化的对象有个对象原型指向原型对象原型指向的是实例化对象的构造函数的原型其实原型上也有一个对象原型那么这个指向什么指向Object的原型Object的原型上也有一个对象原型在往上指就是null规则只要是对象就有对象原型只要是原型对象就有constructor访问一个对象属性1.先找对象自身的属性方法2.原型的属性方法3.原型的原型的属性方法4.直到null回头看array的map方法为什么有这个方法其实就是在array的原型上有这个方法