- 1)立刻创建对象------ 一旦调用构造函数,立刻创建对象(因为使用new关键字,就如我们前面学习的,使用new会立刻在堆内存中开辟新的空间创建对象
- 2)将新建的对象设置为函数中的this(因此在构造函数中,可以使用this来引用新建的对象)
最终
- 3)逐行执行函数的代码
- 4)将这个新建的对象作为返回值返回
总结:
- 使用同一个构造函数创建的对象属于同一个类
- 每个对象称为该类的实例
- 使用(对象 instanceof 狗仔函数)可以检查obj是否为Person类的实例
如: per instanceof Person --true表示是,反之
使用new Object()方式区别不出来
但是!!!!
per instanceof Object----返回结果是true
Object相当于祖宗,因为所有对象都是它的后代
使用构造函数的存在的缺陷:
对于同功能的方法,完全可以使所有对象共享同一个方法(不用每次创建对象时都创建)
解决方法:
将这个函数提出到全局作用域中
同时,所有又同个构造方法创建的对象的方法都是指向了同一个全局的fun方法
好处:大大节省了空间与提高了性能
但是又引发了新的问题,即尽量不要在全局作用域中添加变量
- (因为将函数定义在全局作用域中,污染了全局作用域的命名空间)
- 而且定义在全局作用域中不安全(因为开发往往不是一个人开发)
因此,引入新的解决方案
引入:
- 我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype(对于函数)
1)这个属性对应一个对象,这个对象就是我们所谓的原型对象
2)如果函数作为普通函数调用prototype没有任何作用
3)当函数以构造函数的形式调用,它所创建的对象也会有一个隐含的属性--------该属性指向构造函数的原型对象(prototype)------我们可以通过__proto__访问到该属性
由同一个构造方法创建的对象的__proto__原型属性指向的是同一个对象
原型对象的作用
原型对象就相当于一个公开的区域,所有一个类的实例都可以反问到这个原型对象,因此我们可以将对象中共有的内容,统一设置在原型对象中,即可解决上面所说的全局函数的问题
注意:当我们访问对象的一个属性或者方法时,它会先在自身中寻找,有则直接使用;如果没有则会去原型对象中查找,找到则直接使用
向原型中添加函数同理,这样便解决上述的定义全局函数污染变量命名空间的问题,如下定义
总结:
以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数中!这样不用为每一个对象添加,也不会影响全局作用域,就可以使每个对象都具有这个属性和方法了
ps:使用in检查对象中是否含有某个属性时,如果对象中没有,但是原型中有。也会返回true,