原型模式: 个人觉得跟继承里面的 组合继承没什么区别,需要注意的是:
原型模式继承下的对象,他们共享的基类 的protytype的原型函数占据的内存空间是一样,所以动一个就动了所有。
var SuperClass = function ( arg1 , arg2 ) { this.val1 = arg1; this.arg2 = arg2; }; SuperClass.prototype = { fun1 : function(){ }, fun2 : function () { } }; var SubClass = function ( arg1 , arg2 ) { SuperClass.call( this, arg1 , arg2); }; SubClass.prototype = new SuperClass(); // 重写继承的方法 SubClass.prototype.fun1 = function () { };
原型继承,其实就是多继承 , 仔细看下感觉跟前面的 建造者模式也有相似之处,由多个对象构成,建造者模式则是通过new 出来的实例化对象更易变通。
// 这里原型继承 是 把每个对象的属性 作为 子类的 原型链。
function prototypeExtend(){ var F = function(){}, args = arguments, i = 0, len = args.length; for( ; i<len ; i++ ){ for( var j in args[i] ){ F.prototype[j] = args[i][j]; } } return new F(); } var s1 = { speed : 20, swim : function () { console.log( '游泳速度' + this.speed ); } }, s2 = { run : function ( n ) { console.log( '奔跑速度:' + n); } }, s3 = { jump : function () { console.log( 'jump'); } }; var t = prototypeExtend( s1, s2, s3); t.swim(); t.run( 10 ); t.jump();
// 多继承, 复制对象的属性到自己身上
// 多继承 复制 多个对象属性 Object.prototype.mix = function () { var i= 0, len = arguments.length, arg; for( ; i<len ; i++ ){ arg = arguments[i]; for( var property in arg ){ this[property] = arg[property]; } } }; var book1 = { color: "bluc" }, book2 = { name: "java" }, book3 = { price: 100 }; book1.mix( book2 , book3 ); console.log( book1 );