John Resig 的 JavaScript 继承实现:为什么要“初始化”?
John Resig's JavaScript inheritance implementation: why `initializing`?
我正在研究 John Resig 的 OOO implementations in JavaScript。代码如下:
(function(){
var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
this.Class = function(){};
Class.extend = function(prop) {
var _super = this.prototype;
initializing = true;
var prototype = new this();
initializing = false;
for (var name in prop) {
// ...
}
function Class() {
if ( !initializing && this.init )
this.init.apply(this, arguments);
}
Class.prototype = prototype;
Class.prototype.constructor = Class;
Class.extend = arguments.callee;
return Class;
};
})();
问题是:为什么我们在这里使用initializing
?
我猜测语句var prototype = new this();
可能是异步的。所以当 new ChildClass()
被调用时,初始化(将 properties
赋值给 ChildClass
的原型)可能还没有完成。但是我不太确定它是否正确。
四处寻找,还是无法理解使用变量initializing
的目的。我发现这篇文章有一些解释,但我看不懂:Understanding John Resig's 'Simple JavaScript Inheritance'
谁能详细解释一下它的用途?比如说,给出一些代码在没有 initializing
?
的情况下失败的场景
更新
问题已解决。
我写了一篇文章记录细节:Understanding John Resig’s ‘Simple JavaScript Inheritance’
function Class() {
if ( !initializing && this.init )
this.init.apply(this, arguments);
}
当 initializing
为真时,你就是 'setting up' Class 对象本身,所以你不想调用每个具体定义的 init
实例方法class.
你可以这样做:
var RedCoupe = Class.extend({
初始化:函数(){
this._type = 'coupe';
this._color = 'red';
});
var myCar = new RedCoupe();
在这种情况下,您希望 new RedCoupe();
调用 init,但在 defiing var RedCoupe = Class.extend({ ... });
时不调用,是否有意义?
我正在研究 John Resig 的 OOO implementations in JavaScript。代码如下:
(function(){
var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
this.Class = function(){};
Class.extend = function(prop) {
var _super = this.prototype;
initializing = true;
var prototype = new this();
initializing = false;
for (var name in prop) {
// ...
}
function Class() {
if ( !initializing && this.init )
this.init.apply(this, arguments);
}
Class.prototype = prototype;
Class.prototype.constructor = Class;
Class.extend = arguments.callee;
return Class;
};
})();
问题是:为什么我们在这里使用initializing
?
我猜测语句var prototype = new this();
可能是异步的。所以当 new ChildClass()
被调用时,初始化(将 properties
赋值给 ChildClass
的原型)可能还没有完成。但是我不太确定它是否正确。
四处寻找,还是无法理解使用变量initializing
的目的。我发现这篇文章有一些解释,但我看不懂:Understanding John Resig's 'Simple JavaScript Inheritance'
谁能详细解释一下它的用途?比如说,给出一些代码在没有 initializing
?
更新
问题已解决。
我写了一篇文章记录细节:Understanding John Resig’s ‘Simple JavaScript Inheritance’
function Class() {
if ( !initializing && this.init )
this.init.apply(this, arguments);
}
当 initializing
为真时,你就是 'setting up' Class 对象本身,所以你不想调用每个具体定义的 init
实例方法class.
你可以这样做: var RedCoupe = Class.extend({ 初始化:函数(){ this._type = 'coupe'; this._color = 'red'; }); var myCar = new RedCoupe();
在这种情况下,您希望 new RedCoupe();
调用 init,但在 defiing var RedCoupe = Class.extend({ ... });
时不调用,是否有意义?