傳遞的參數以列表的形式,倒不如以對象的形式。函數
<!-- 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