面向对象三大特征
封装
继承
javaScript当中的继承是指
1 | //一个对象没有一些方法和属性,但是另外一个对象有 |
多态
多态是在强类型语言中比较常用,JavaScript中没有相应的体现
父类的属性和方法供所有的子类共享 但是父类不能访问子类的属性和方法
使用父类的引用(指针)指向子类的对象 就叫做多态
//使用多态来隐藏不同
创建对象的方式
对象:字面量
只能创建一次对象,复用性较差,如果要创建多个对象,代码冗余度太高
1 | var obj = { |
封装简单的工厂函数(不推荐使用了)
1 | function createSong(songName,singerName){ |
自定义构造函数 Object Array
什么是构造函数?
1 | //构造函数其实也是函数,但是通常用来初始化对象 |
传统构造函数存在的问题
/如果构造函数没有参数,那么在调用的时候 小括号 可以省略
如果在构造函数中定义函数,那么每次创建对象,都会重新创建该函数
//但是函数内部代码完全相同,就造成了资源浪费
//为了处理这个问题,我们要让所有的对象共用一个方法
//在构造函数外部定义好该函数,将该函数赋值给构造函数内的方法
使用这种方式写好的方法中的this指向的就是调用该方法的对象
//this 谁调用就是谁
//使用这种方式存在的问题
1.全局变量增多,造成污染
2.代码结构混乱,不易维护
原型
原型是个什么玩意儿?
//在构造函数创建出来的时候,系统会默认的帮构造函数创建并关联一个神秘的对象,这个对象就是原型
//原型默认的是一个空的对象
原型的作用
1 | //原型中的属性和方法 可以被使用该构造函数创建出来的对象 使用 |
相关概念的补充
1 | /实例化 |
原型使用方法
1.利用对象的动态特性给原型对象添加成员
2.直接替换原型对象
在替换原型之前创建的对象的原型 和 在替换原型对象之后的创建的对象
的原型 不是同一个!
类似于基本类型的复制,将原型变成两份 原来的对替换之前创建的对象有效,替换过后的对替换后创建的对象有效
原型注意事项
1.使用对象访问属性的时候,如果在本身内找不到就会去原型中查找
但是使用点语法进行属性赋值的时候,并不会去原型中进行查找
使用点语法赋值的时候如果,对象中不存在该属性,就会给该对象新增该属性,而不会去修改原型中的属性
2.如果在原型中的属性是引用类型的属性,
那么所有的对象共享该属性,并且一个对象修改了该引用类型属性中的成员,其他对象也都会受影响
3.一般情况下不会将属性放到原型对象中
一般情况下原型中只会放需要共享的方法
proto
1 | 1.通过构造函数访问原型 |
constructor
1 | /原型对象在创建出来的时候,会默认的有一个constructor属性 |
构造函数属性相关问题
在使用新的对象替换掉默认的原型对象之后
//原型对象中的constructor属性会变成 Object
//为了保证整个 构造函数—原型—-对象 之间的关系的合理性
//应做如下操作:
//在替换原型对象的时候,在新的原型对象中手动添加 constructor 属性
加constructor让其在指回来
1 | function Person(){ |
使用原型解决传统构造函数的问题
1 | function Person(name, age, gender) { |
如何使用原型来解决构造函数存在的问题?
构造函数的原型对象中的成员,可以被该构造函数创建出来的所有对象访问
而且,所有的对象共享该对象
所以,我们可以将构造函数中需要创建的函数,放到原型对象中存储
这样就解决 全局变量污染的问题 以及 代码结构混乱的问题