javascript的设计模式(三)———— 原型模式
原型模式在js中经常用来创建对象的一种模式,它并不是通过创建类来创建对象,而是通过克隆一个对象来创建对象。在js中没有类的概念,所以js中的面向对象编程方式基本都是使用原型模式实现的。
正文
1.原型对象
function Person(){};
Person.prototype.name = 'Marys';
var person1 = new Person();
1.1 原型链

var person1 = new Person();
console.log(person1.name);
</section>
#### 1.2 关于this
<section>this的指向是根据**执行上下文(作用域)**决定的,是一个由构造函数constructor创建的对象,所以this中的属性方法并不存在原型对象中。具体this的变化过程如下:
<ul>
<li>创建实例对象</li>
<li>将作用域赋予对象(因此this就指向了新对象)</li>
<li>执行构造函数中的代码,为实例对象添加属性和方法</li>
</ul>
</section>
### 小结
<section>js中的原型模式实际上就是用来实现继承的一种方式,但是使用原型模式继承的属性和方法都有一个缺点:对于引用类型值得属性是会共用的。也就是说继承的属性如果是引用类型值不是独立的,当改变其中一个实例的属性值时,其他同父级的实例的该属性也是会改变。如下代码,当person1的numbers属性推入一个值,person2中的numbers值也会受影响。但是如果代码是``person1.numbers = [1,2,3]``,person2的numbers属性是不会受到影响的,因为这样相当于person1声明了一个新的属性numbers,这是属于person1自己的属性,用this关键字是能读取到的,当声明属性与``__proto__``中的属性重名的时候,会遮挡原型对象中的属性。
```javascript
function Person(){};
Person.prototype.numbers = [1,2,3,4];
var person1 = new Person();
var person2 = new Person();
person1.numbers.push(5);
console.log(person2.numbers);//[1,2,3,4,5]
person1.numbers = [1,2,3];
console.log(person2.numbers);//[1,2,3,4,5]
console.log(person1);
/*
Person {numbers: Array(3)}
numbers:(3) [1, 2, 3]
__proto__:
numbers:(5) [1, 2, 3, 4, 5]
constructor:ƒ Person()
__proto__:Object
*/

浙公网安备 33010602011771号