js面向对象
2018-07-15 本文已影响0人
luckyQAQ
1.对象的定义
工厂模式:
问题:没有解决对象识别的问题(即怎样知道一个对象的类型)。
![](https://img.haomeiwen.com/i10470618/b638e5502f2b5cdd.png)
构造函数模式
特点:出现了this关键词,常见对象时需要new,创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型
缺点:如果对象中定义了一个方法,那么每次new对象时都要执行
(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);
(3) 执行构造函数中的代码(为这个新对象添加属性);
(4) 返回新对象。
![](https://img.haomeiwen.com/i10470618/3f5d4d0e5a11c228.png)
原型模式
每创建一 个函数,就会同时创建它的 prototype 对象,这个对象也会自动获得 constructor 属性
![](https://img.haomeiwen.com/i10470618/9c3e24a3e1114ac0.png)
而现在,我们要修改Person的prototype属性,比如下面的代码
![](https://img.haomeiwen.com/i10470618/732c5aa50798f07a.png)
上面的操作不可行,但是直接在原型链上添加一个方法是不会切断的
![](https://img.haomeiwen.com/i10470618/c816ebe090a379c5.png)
解决办法,
![](https://img.haomeiwen.com/i10470618/496d92c902f9b32e.png)
构造函数和原型模式结合
我们创建的每个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象, 而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。如果按照字面意思来理解,那 么 prototype 就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处是可以 让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,而是 可以将这些信息直接添加到原型对象
![](https://img.haomeiwen.com/i10470618/c4964cd23cf71e7a.png)