Почему Джон Резиг повторно объявляет оригинальный _super после использования унаследованного _super?
Прокрутите вниз, чтобы увидеть строки, которые мне интересны
Имеет смысл, что он объявляет унаследованную функцию this._super
перед применением
Что я не получаю, так это: после того, как он выполняет функцию и получает возвращаемое значение val, почему он заменяет
this._super
с чем бы это ни было заранее??
В комментарии говорится, что его нужно объявить только временно, но почему бы вам не оставить его объявленным? Я не вижу, как можно улучшить сборку мусора или какую-либо другую оптимизацию.
/* Simple JavaScript Inheritance for ES 5.1
* based on http://ejohn.org/blog/simple-javascript-inheritance/
* (inspired by base2 and Prototype)
* MIT Licensed.
*/
(function(global) {
"use strict";
var fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
// The base Class implementation (does nothing)
function BaseClass(){}
// Create a new Class that inherits from this class
BaseClass.extend = function(props) {
var _super = this.prototype;
// Set up the prototype to inherit from the base class
// (but without running the init constructor)
var proto = Object.create(_super);
// Copy the properties over onto the new prototype
for (var name in props) {
// Check if we're overwriting an existing function
proto[name] = typeof props[name] === "function" &&
typeof _super[name] == "function" && fnTest.test(props[name])
? (function(name, fn){
return function() {
var tmp = this._super;
// Add a new ._super() method that is the same method
// but on the super-class
this._super = _super[name];
// The method only need to be bound temporarily, so we
// remove it when we're done executing
var ret = fn.apply(this, arguments);
this._super = tmp; // <------ why??
return ret;
};
})(name, props[name])
: props[name];
}
// The new constructor
var newClass = typeof proto.init === "function"
? proto.hasOwnProperty("init")
? proto.init // All construction is actually done in the init method
: function SubClass(){ _super.init.apply(this, arguments); }
: function EmptyClass(){};
// Populate our constructed prototype object
newClass.prototype = proto;
// Enforce the constructor to be what we expect
proto.constructor = newClass;
// And make this class extendable
newClass.extend = BaseClass.extend;
return newClass;
};
// export
global.Class = BaseClass;
})(this);
1 ответ
Немного путаницы по поводу того, что this
имел в виду
При объявлении this._super = function
, весь экземпляр класса будет иметь ключ _super
, которая указывает на конкретную функцию (явно не желательно)