持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
- 面向对象的设计思想
- 抽象出Class(构造函数)
- 根据Class(构造函数)创建Instance(实例)
- 指挥Instance得结果👇
-
- 构造函数和实例对象的关系
-
构造函数是根据具体的事物抽象出来的抽象模板
-
实例对象是根据抽象的构造函数模板得到的具体实例对象
-
每一个实例对象都通过一个constructor属性,执行创建该实例的构造函数,(但是constructor是实例的属性这个说法并不严谨,因为可以随意更改)
-
可以通过constructor属性判断实例和构造函数之间的关系(这种方法其实并不严谨,推荐使用instanceof操作符)
-
- 静态成员和实例成员
-
使用构造函数方法创建对象时,可以给构造函数和常见的实例对象添加属性和方法,这些属性和方法都叫做成员
-
实例成员:在构造函数内部添加给this的成员,属于实例对象的成员,在创建实例对象后,必须由对象调用
-
静态成员:添加给构造函数自身的成员,只能使用构造函数调用,不能使用生成的实例对象调用(在构造函数外面进行定义:Person.version = “1.0”)
-
Math是内置对象,不是一个函数对象。
-
- 构造函数的问题
- 浪费内存。比如上面的构造函数中,都有一个printScore方法,每创建一个实例对象,都会创建一个相同的printScore方法,会造成内存浪费
- 解决方法1:将公共的函数提取到构造函数之外,然后在构造函数内部直接调用外部的函数,单不需要加括号。但是当有多个公共函数,需要在外部创建多个函数,可能会造成命名冲突
- 解决方法2:将多个公共函数封装到一个对象中,然后再在构造函数中打点调用函数
- 解决方法3👇:使用原型对象可以更好地解决内存浪费问题。
- prototype 原型对象
-
任何函数都具有一个prototype属性,该属性是一个对象
-
可以在原型对象上添加属性和方法
-
构造函数的prototype对象默认都有一个constructor属性,指向prototype对象所在的函数
-
通过构造函数得到的实例对象内部都会包含一个构造函数的prototype对象的指针_proto_
-
_proto_属性并不是一个标准的属性,是浏览器自己根据语法自动生成的;在真正开发的过程中,是不会书写_proto_属性的,而是直接省略._proto_调用构造函数的方法或者对象
-
所有的对象都有一个_proto_属性,是一个指针,指向的是生成实例对象的构造函数的原型对象。即Person.prototype = person1.proto
-
实例对象可以直接访问原型对象成员,即解决方法:
-
-
总结
-
-