javascript原型模式
原型模式是用来创建对象的一种模式。在以类为中心的语言中,要创建一个对象首先要指定这个对象的类型,然后实例化一个对象。使用原型模式创建对象时不必关心对象的具体类型,而是找到一个对象,然后通过克隆来创建一个一模一样的对象。所以在前者中如果要根据一个对象创建多个相同的对象,我们需要先保存这个对象的所有属性信息,然后将属性信息设置到新创建的对象上,而在原型模式中我们只需要使用克隆就能完成同样的功能。
看简单代码:
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,不支持这个方法的浏览器可以使用如下代码:
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对象的克隆。
在javascript中new也是通过克隆来实例化对象的,克隆的是构造器函数的原型对象,new运算符的作用等同于如下代码:
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中新创建的对象都是基于原有对象的克隆,所以在Javascript中存在一个最原始的对象:Object.prototype,所有对象都是由它克隆而来。


浙公网安备 33010602011771号