我一直在阅读Crockford的’The Good Parts’中关于功能继承的章节.在哺乳动物的例子中,他让我有点困惑,为什么他使用上级方法来修改get_name函数.以下是有问题的示例: Function.prototype.metho
Function.prototype.method = function (name, func) { this.prototype[name] = func; return this; }; var mammal = function (spec) { var that = {}; that.get_name = function () { return spec.name; }; that.says = function () { return spec.saying || ''; }; return that; }; var myMammal = mammal({ name: 'Herb' }); var cat = function (spec) { spec.saying = spec.saying || 'meow'; var that = mammal(spec); that.purr = function (n) { var i, s = ''; for (i = 0; i < n; i += 1) { if (s) { s += '-'; } s += 'r'; } return s; }; that.get_name = function () { return that.says() + ' ' + spec.name + ' ' + that.says(); }; return that; }; Object.method('superior', function (name) { var that = this, method = that[name]; return function () { return method.apply(that, arguments); }; }); var coolcat = function (spec) { var that = cat(spec); var 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(); // 'like meow Bix meow baby'
我对此感到困惑,因为我可以通过删除上级方法并仅更改coolcat来复制相同的内容,如下所示:
var coolcat = function(spec) { var that = cat(spec); var super_get_name = that.get_name(); that.get_name = function(n) { return 'like ' + super_get_name + ' baby'; }; return that; };
所以,我不明白为什么Crockford选择使用优越的方法.有人能够解释吗?
这里的想法是:var super_get_name = that.superior('get_name');
使super_get_name成为一个函数 – 每次调用它 – 都会调用它的原始get_name方法.这允许新的get_name调用旧的(超类)get_name.
现在,如果原始的get_name方法除了返回一个永不改变的值之外永远不会有任何影响,那么,这是毫无意义的;你可以保存那个永不改变的单值,然后在新的get_name中使用它.但是,如果原始get_name实际上可以执行某些操作(例如,运行AJAX请求或更改HTML元素的样式),或者其返回值可以更改(例如,如果存在某些相应的set_name方法),那么你的代码所做的事情(保存原始的返回值并使用它)和Crockford的代码之间会有一个重要的区别(保存原始方法并调用它).