构造器调用模式
当一个函数对象被创建时,Function构造器会运行类似这样的代码:
this.prototype = {constructor: this}
new一个函数事会发生:
Function.method('new', function() { // 创建新对象,继承原型 let that = Object.create(this.prototype); // 调用构造函数,绑定this到新对象 let res = this.apply(that, arguments); return typeof res === 'object' && res || that;});
伪类继承
let Mammal = function(name) { this.name = name;}Mammal.prototype.get_name = function() { return this.name;}// 构造一个实例let myMammal = new Mammal('zhangsan');// 利用伪类继承Mammallet Cat = function(name) { this.name = name; this.age = age;}Cat.prototype = new Mammal();Cat.prototype.get_age = function() { return this.age;}let myCat = new Cat('miao');
以上就是一个简单的伪类继承。使用构造器有个严重的危害,如果在调用构造器函数的时候忘记使用new前缀,this不仅不会绑定到新对象,还会污染全局变量;
原型模式
原型模式中,我们采用对象来继承。
let myMammal = { name: 'aa', age: 22, get_name: function() { return this.name; }}let myCat = Object.create(myMammal);Cat.get_age = function() { return this.age;}
这种继承方式,导致没有私有属性和私有函数
函数化模式
它的每一层都是在扩充that
Function.prototype.method = function (name,func) { this.prototype[name] = func; return this; }// 工厂mammal函数var mammal = function (spec) { var that = {}; that.get_name = function () { return spec.name; } that.says = function (spec) { return spec.saying || ''; } return that;}// 工厂cat函数(基于mammal的函数)var cat = function (spec) { spec.saying = spec.saying || 'meow'; // 直接调用mammal函数 var that = mammal(spec); that.purr = function (n) { var i, s = ''; for (i = 0; i < n; i += 1) { if(s) { s += '-'; } s += 'r'; } } that.get_name = function () { return that.says() + ' ' + spec.name + ' ' + that.says(); } return that;}// 创建myCat对象var myCat = cat({name: 'Henrietta'});Object.method('superior',function (name) { var that = this, method = that[name]; return function () { return method.apply(that, arguments) }})// 工厂coolcat函数(基于cat函数)var coolcat = function (spec) { var that = cat(spec), super_get_name = that.superior('get_name'); that.get_name = function (n) { return 'like ' + super_get_name() + ' baby'; } return that;}var myCoolCat = coolcat({name : 'Bix'});var name = myCoolCat.get_name();
部件
没看懂。。
let eventuality = function(that) { let registry = {}; that.fire = function(event) { let array, func, handler, i, type = typeof event === 'string' ? event : event.type; if (registry.hasOwnProperty(type)) { array = registry[type]; for(i = 0; i < array.length; i++) { handler = array[i]; func = handler.method; if (typeof func === 'string') { func = this[func]; } func.apply(this, handler.parameters || [events]); } } return this; } that.on = function(type, method, parameters) { let handler= { method, parameters }; if (registry.hasOwnProperty(type)) { registry[type].push(handler); } else { registry[type] = [handler]; } return this; } return that;}