传递的参数以列表的形式,倒不如以对象的形式。函数
<!-- lang: js --> var myObject = maker(f, l ,m, c, s); var myObject = maker({ first: f, middle: m, last: l, state: s, city: c });
基于原型的继承:一个新对象能够继承一个就对象的属性。经过构造一个有用的对象开始,接着能够构造更多和那个对象相似的对象。 先构造一个有用的对象。this
<!-- lang: js --> var myMammal = { name : 'Herb the Mammal', get_name : function () { return this.name; }, says : function () { return this.saying || ''; } };
接下来,利用第三章的Object.create方法构造更多的实例(见我前面的文章第6点)。spa
<!-- lang: js --> var myCat = Object.create(myMammal); myCat.name = 'Henrietta'; myCat.saying = 'meow'; myCat.purr = function (n) { var i, s = ''; for (i = 0; i < n; i += 1) { if (s) { s += '-'; } s += 'r'; } return s; }; myCat.get_name = function () { return this.says + ' ' + this.name + ' ' + this.says; };
以前的继承模式的弱点就是无法保护隐私。 这里来一个函数化构造器的伪代码模板。.net
<!-- lang: js --> var constructor = function (spec, my) { var that,其余的私有实例变量; my = my || {}; 把共享的变量和函数添加到my中 that = 一个新对象 添加给 that 的特权方法 return that; };
让咱们把这个模式应用到mammal的例子里。此处不须要my。 name和saying属性如今是彻底私有的。只有经过get_name和says两个特权方法才能够访问他们。prototype
<!-- lang: js --> var mammal = function (spac) { var that = {}; that.get_name = function () { return spac.name; }; that.says = function () { return spec.saying || ''; }; return that; }; var myMammal = mammal({name : 'Herb'});
在伪类模式里,构造器函数Cat不得不重复构造器Mammal已完成的工做(这句话理解不能 TT)。在函数化模式中那再也不须要了,由于构造器Cat会调用构造器Mammal,让Mammal去作对象建立中的大部分工做,因此Cat只需关注自身的差别便可。code