原型链模式

原型链模式

构造函数模式中拥有了类和实例的概念,并且实例和实例之间是相互独立开的

function CreatePerson(name, age) {
  this.name = name;
  this.age = age;
  this.sayHi = function () {
    console.log("我是 " + this.name + "我今年 " + this.age + "岁!")
  }
}
var p1 = new CreatePerson('小王', '28');
var p2 = new CreatePerson('小李', '23');
console.log(p1.sayHi === p2.sayHi); // false 

当把sayHi方法放在原型上时:

function CreatePerson(name, age) {
  this.name = name;
  this.age = age;
}
CreatePerson.prototype.sayHi = function () {
  console.log("我是 " + this.name + "我今年 " + this.age + "岁!")
};
var p1 = new CreatePerson('小王', '28');
var p2 = new CreatePerson('小李', '23');
console.log(p1.sayHi === p2.sayHi); // true

基于构造函数模式的原型模式解决了方法或者属性公有的问题,把实例之间相同的属性和方法提取成公有的属性和方法,想要谁公有就把它放在CreatePerson.prototype上即可。

原型的特点

  1. 每一个函数数据类型(普通函数、类)都有一个自带的属性prototype,并且这个属性是一个对象数据类型的值
  2. 在prototype上,有一个属性constructor(构造函数),属性值是当前函数(类)本身
  3. 每一个对象数据类型(普通对象、实例、prototype……)也自带一个属性_ proto _,属性值是当前实例所属类的原型(prototype)

Object是js中所有对象数据类型的基类

  1. f1 instanceof Object为true,因为f1 通过_ proto _可以向上查找,不管有多少级,最后总能找到Object
  2. 在Object.prototype上没有_ proto _这个属性

原型链

f1.hasOwnProperty(“x”),说明hasOwnProperty是f1的一个属性,但是f1的私有属性上并没有这个方法。
1. 通过对象名.属性名的方式获取属性值的时候,首先在对象的私有属性上进行查找,如果私有属性上有这个属性,则获取的是私有的属性值。如果私有的没有,则通过_ proto _ 找到所属类的原型(类的原型上定义的属性和方法都是当前实例公有的属性和方法),原型上存在的话,获取的是公有的属性值;如果原型上也没有,则继续通过原型上的 _ proto _继续向上查找,一直找到Object.prototype为止。
这种查找的机制就是“原型链”模式

this

在原型模式中,this常用的有两种情况:
在类中this.xxx = xxx;this是当前类的实例
某个方法中的this要看执行的时候“ . ”前面是谁,this就是谁

在内置类的原型上扩展我们的方法:

Array.prototype.myUnique = function () {
  var obj = {};
  for (var i=0;i<this.length;i++) {
    var cur = this[i];
    if (obj[cur] === cur) {
      this[i] = this[this.length-1];
      this.length--;
      i--;
      continue;
    }
    obj[cur] = cur
  }
  obj = null;
};
var arr = [1,3,5,6,5,11];
arr.myUnique();
console.log(arr); // [1,3,5,6,11]

链式写法

执行完成数组的一个方法可以紧接着执行下一个方法

arr.sort(function (a,b) {
  return a -b;
}).reverse().pop();
console.log(arr); // [11,6,5,3]

原理:为什么可以使用sort方法?

因为sort是Array.prototype上的公有的方法,而数组arr是Array这个类的一个实例,所以arr可以使用sort方法,数组才能使用我们Array原型上定义的属性和方法
sort执行完成的返回值是一个排序后的“数组”
reverse执行完成的返回值是一个数组,可以继续执行pop
pop执行完成的返回值是被删除的那个元素,不是一个数组了

如何使myUnique后可以使用链式操作?

Array.prototype.myUnique = function () {
  var obj = {};
  for (var i = 0; i < this.length; i++) {
    var cur = this[i];
    if (obj[cur] === cur) {
      this[i] = this[this.length - 1];
      this.length--;
      i--;
      continue;
    }
    obj[cur] = cur
  }
  obj = null;
  return this; // 目的是为了实现链式操作
};
var arr = [3, 1, 5, 6, 5, 11];
arr.myUnique().sort(function (a, b) {
  return a - b;
});
console.log(arr); // [1, 3, 5, 6, 11]

你可能感兴趣的:(JavaScript,javascript)