Javascript原型模式总结梳理

  在大多数面向对象语言中,对象老是由类中实例化而来,类和对象的关系就像模具跟模件同样。Javascript中没有类的概念,就算ES6中引入的class也不过是一种语法糖,本质上仍是利用原型实现。在原型编程语言中,类并非必需的,对象不必定须要由类实例化而来,而是经过克隆另一个对象来获得。编程

  原型模式是用来建立对象的一种模式。在以类为中心的语言中,要建立一个对象首先要指定这个对象的类型,而后实例化一个对象。使用原型模式建立对象时没必要关心对象的具体类型,而是找到一个对象,而后经过克隆来建立一个如出一辙的对象。因此在前者中若是要根据一个对象建立多个相同的对象,咱们须要先保存这个对象的全部属性信息,而后将属性信息设置到新建立的对象上,而在原型模式中咱们只须要使用克隆就能完成一样的功能。设计模式

  在某些玄幻小说中常常会出现某些修真大能,以分身的形式游走世间。这个过程很适合原型模式的应用:浏览器

function Master(){
    this.blood = 100;
    this.level = 6;
}

var noumenon = new Master();
noumenon.level = 9;


var ektype = Object.create(noumenon);

console.log(ektype);

  ES5提供了原生的克隆方法:Object.create,不支持这个方法的浏览器可使用以下代码:app

function clone(obj){
    function F(){};
    F.prototype = obj;
    return new F();
}

var ektype = clone(noumenon);

  经过以上代码,咱们看到了如何经过原型模式来克隆出一个如出一辙的的对象。原型模式的真正意义并不是建立一个如出一辙的对象,而是提供一种建立对象的方式,Javascript的面向对象机制是基于原型模式的,他的对象系统就是使用原型模式,经过克隆来建立的,克隆是建立一个对象的过程和手段。以继承为例:编程语言

function Person(name){
    this.name = name;
}

function Developer(lang){
    this.language = lang;
}

var p = new Person('coder');

Developer.prototype = p;

var dev = new Developer('Javascript');

 

  基于原型的继承体系,子类的每次实例化都是对其构造函数的prototype属性的克隆。因此每次建立Developer对象,其实都是在对p对象的克隆。函数

  在Java等以类为中心的面向对象语言中,常常使用new实例化一个对象。可是Javascript是基于原型的面向对象语言,在这里new运算符建立对象的方式与Java中的new运算符并不相同,Javascript中的new运算符也是经过克隆来实例化对象的,克隆的是构造器函数的原型对象,new运算符的做用等同于以下代码:this

function Person(name){
    this.name = name;
}

function Developer(lang){
    this.language = lang;
}

var p = new Person('coder');

Developer.prototype = p;


function _new(_Constructor) {
    var that = Object.create(_Constructor.prototype);
    var args = Array.prototype.slice.call(arguments, 1);
    var other = _Constructor.apply(that, args);
    
    return (typeof other === 'object' && other) ? other : that;
}
_new(Developer, 'JavaScript')

  从这咱们也能够看出,Javascript的原型实际上存在着诸多矛盾,它的某些复杂语法看起来就像那些基于类的语言,这掩盖了它的原型机制。因此jQuery中尽可能避免使用new运算符来建立对象。spa

  根据前面所说Javascript中新建立的对象都是基于原有对象的克隆,因此在Javascript中存在一个最原始的对象:Object.prototype,全部对象都是由它克隆而来。prototype

 

  这里所说的克隆是在Javascript原型模式这一大环境下的一种语义表达,在计算机的物理世界中并不存在真正的克隆。因此这里对于克隆应当理解为产生一个拥有__proto__属性指向原对象的对象的过程,原对象成为被克隆的对象,也就是构造函数的prototype对象。设计

 

  拥有以上共识后,咱们能够获得在Javascript中原型编程的基本规则:

  1. Javascript中绝大多数数据都是对象
  2. 要获得一个对象,不是经过实例化类,而是找到一个对象做为原型并克隆它
  3. 对象会记住它的原型
  4. 若是对象没法响应某个请求,他会把这个请求委托给它本身的原型

 

参考书籍:

《Javascript语言精粹》

《Javascript设计模式与开发实践》

相关文章
相关标签/搜索