javaScript常见输出方式( 四 )


? 2.每个"原型对象"中都有一个默认的属性, 叫做
? 指向当前原型对象对应的那个"构造函数"
? 3.通过构造函数创建出来的对象我们称之为"实例对象"
? 每个"实例对象"中都有一个默认的属性, 叫做
? 指向创建它的那个构造函数的"原型对象"
函数对象原型关系
? 1.所有的构造函数都有一个属性, 所有属性都指向自己的原型对象
? 2,所有的原型对象都有一个属性, 所有属性都指向自己的构造函数
? 3.所有函数都是构造函数的实例对象
? 4.所有函数都是对象, 包括构造函数
? 5.所有对象都有属性
? 6.普通对象的属性指向创建它的那个构造函数对应的"原型对象"
? 7.所有对象的属性最终都会指向"原型对象"
? 8."原型对象"的属性指向NULL
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img--14)(%E5%8E%9F%E5%9E%8B.PNG)] 原型链
1.对象中组成的链条我们称之为原型链
2.对象在查找属性和方法的时候, 会先在当前对象查找
? 如果当前对象中找不到想要的, 会依次去上一级原型对象中查找
? 如果找到原型对象都没有找到, 就会报错
封装性 封装性
就是隐藏实现细节,仅对外公开接口
为什么要封装?
? 4.1不封装的缺点:当一个类把自己的成员变量暴露给外部的时候,那么该类就失去对属性的管理权,别人可以任意的修改你的属性
? 4.2封装就是将数据隐藏起来,只能用此类的方法才可以读取或者设置数据,不可被外部任意修改. 封装是面向对象设计本质(将变化隔离) 。这样降低了数据被误用的可能 (提高安全性和灵活性)
属性方法
在中属性和方法分类两类
? 1.1实例属性/实例方法
? 在企业开发中通过实例对象访问的属性, 我们就称之为实例属性
? 在企业开发中通过实例对象调用的方法, 我们就称之为实例方法
? 1.2静态属性/静态方法
? 在企业开发中通过构造函数访问的属性, 我们就称之为静态属性
? 在企业开发中通过构造函数调用的方法, 我们就称之为静态方法
继承
想要继承,就必须要提供个父类(继承谁,提供继承的属性)
一、原型链继承
重点:让新实例的原型等于父类的实例 。
特点:1、实例可继承的属性有:实例的构造函数的属性,父类构造函数属性,父类原型的属性 。(新实例不会继承父类实例的属性!)
缺点:1、新实例无法向父类构造函数传参 。
2、继承单一 。
3、所有新实例都会共享父类实例的属性 。(原型上的属性是共享的,一个实例修改了原型属性,另一个实例的原型属性也会被修改!)
二、借用构造函数继承
重点:用.call()和.apply()将父类构造函数引入子类函数(在子类函数中做了父类函数的自执行(复制))
特点:1、只继承了父类构造函数的属性,没有继承父类原型的属性 。
2、解决了原型链继承缺点1、2、3 。
3、可以继承多个构造函数属性(call多个) 。
4、在子实例中可向父实例传参 。
缺点:1、只能继承父类构造函数的属性 。
2、无法实现构造函数的复用 。(每次用每次都要重新调用)
3、每个新实例都有父类构造函数的副本,臃肿 。
三、组合继承(组合原型链继承和借用构造函数继承)(常用)
重点:结合了两种模式的优点,传参和复用
特点:1、可以继承父类原型上的属性,可以传参,可复用 。
2、每个新实例引入的构造函数属性是私有的 。
缺点:调用了两次父类构造函数(耗内存),子类的构造函数会代替原型上的那个父类构造函数 。