[英]Why is my Javascript parent scope overridden when declaring a subclass?
我有两个javascript类,一个从另一个类继承而来,声明如下:
var Sup = (function(){
var self;
var sup = function(){
self = this;
self.type = 'Sup';
};
sup.prototype.getType = function(){
return self.type;
};
return sup;
})();
var Sub = (function(){
var self;
var sub = function(){
self = this;
Sup.call(self);
self.type = 'Sub';
};
sub.prototype = Object.create(Sup.prototype);
sub.prototype.constructor = sub;
return sub;
})();
当我实例化Sub时,它会覆盖其父类中的self
值:
var sup = new Sup();
var sub = new Sub();
console.log(sup.getType());
console.log(sub.getType());
产量
Sub // I expected Sup
Sub
我有两个问题:
Sup
声明的self
会作为与Sup
每个实例相关联的私有变量。 我喜欢在将所有类定义包含在(function(){...})
时感到整洁,但是当我这样做时,在声明私有方法时,我需要self
变量访问类范围。
例如:
var Sup = (function(){ //... function _getType(){ return self.type; // 'this.type' is undefined here } })();
我可以在保持封闭的(function(){})()
结构的同时解决该问题吗?
编辑:回答如何调用(我称之为)“私有”方法
在_getType
, this
将引用Sup
而不是所创建的对象(例如sup
),因此这解决了我的问题:
var Sup = (function(){
var sup = function(){
this.type = 'Sup';
};
sup.prototype.callPrivateGetType = function(){
return _getType(this);
};
function _getType(that){
return that.type;
}
}
然后做
var sup = new Sup();
var sub = new Sub();
console.log(sup.callPrivateGetType());
console.log(sub.callPrivateGetType());
产量
Sup
Sub
self
不是“私有变量”,也不是这些“类”-因为JavaScript都没有。 您可以非正式地谈论私有变量或类,但是如您在这里所经历的那样,忘记那些概念不能完美地从其他语言中继承过来是非常危险的。
self
是由getType
方法关闭的局部变量。 评估如下:
Sup
分配的右侧评估IIFE: self
是一个局部变量(我们称其为SupSelf
) sup
构造函数 getType
方法; getType
函数是一个闭包,通过SupSelf
关闭 sup
原型从IIFE返回,并分配给Sup
。 当您调用sub.getType()
:
this
设置为sub
,并评估Sup.prototype.getType
: getType
内部, self
是封闭的SupSelf
,它获得了由new Sup()
为其分配的值Sup
。 它不能读取Sub
内部的值self
,因为它不是本地的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.