单例模式、工厂模式、构造函数和原型链

  1. 单例模式:分组,但不能批量生产
  2. 工厂模式:把相同的方法放到一个函数中,函数返回一个对象,执行这个函数即可。(函数的封装 -> 低耦合、高内聚)
  3. 构造函数与工厂模式区别:
    1. 执行时,构造函数:new 类名();工厂模式:函数名();
    2. 返回值是类的实例;
    3. 相同:函数执行时都是先形成一个私有作用域 -> 变量提升 -> 赋值。
  4. js 中所有的类都是函数数据类型,但本身也是一个普通函数。
    实例都是对象数据类型。
  5. 构造函数执行之前,浏览器会默认创建一个对象数据类型的值,这个对象是实例,接下来, this 代表当前实例,分别把属性名和属性值赋给当前实例。最后浏览器将默认的实例返回。
  6. 构造函数中如果手动返回值,如果是基本数据类型,当前实例不变,但如果是手动返回引用类型,会把实例替换掉。
  7. 判断是否是某个类的实例 instanceof,typeof 不能检测对象数据类型下的 数组、正则、函数.
  8. in:检测某一个属性是否属于这个对象,不管是私有属性还是公有属性都返回 true。for ... in .. 遍历私有属性及手动添加在原型上的属性。私有属性可枚举,原型上(包括内置和手动添加的属性)的都不可枚举。propertyIsEnumerable
  9. hasOwnProperty() 只检测私有属性。
  10. isPrototypeOf()
  11. ES5: Object.create(proto,[proertiesObject]):创建一个拥有指定原型和若干属性的对象 。IE6~8 下不兼容。
  12. 克隆对象:
var obj = {
  getX:function(){}
 }
var obj2 = {}
for(var key in obj ){
  if(obj.hasOwnProperty(key)){
    obj2[key] = obj[key];
  }
}

var obj3 = Object.create(obj);  // 这样克隆将 obj 的属性放到 obj3 的原型上了。

function object(obj){      // 模拟 Object.create()
  function Fn(){}
  Fn.prototype = obj;
  return new Fn();
}
  1. 自定义数组去重:
Array.prototype.myUnique = function(){
    var obj = {};
    for(var i = 0; i < this.lenght; 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 = [12,3,23,2,2];
arr.myUnique();
Array.prototype = {
  constructor:Array;
  unique: function(){
      
  }
}
console.dir(Array.prototype);   // 会把之前已经存在于原型上的属性和方法替换,浏览器会屏蔽掉,即不允许这样修改。

Array.prototype.sort=function(){
  console.log('333');    // 内置的方法 sort 被修改了。在修改时加特殊的前缀。
}

你可能感兴趣的:(单例模式、工厂模式、构造函数和原型链)