我有两个 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
<小时/>
我有两个问题:
- 这是为什么呢?我认为
self
,如Sup
中声明的那样,将充当与Sup
的每个实例相关联的私有(private)变量。 我喜欢将所有类定义封装在
(function(){...})
中时获得的整洁感,但是当我这样做时,我需要self
变量在声明私有(private)方法时访问类范围。例如:
var Sup = (function(){ //... function _getType(){ return self.type; // 'this.type' is undefined here } })();
我可以在保留封闭的
(function(){})()
结构的同时解决该问题吗?
编辑:回答如何调用(我所说的)“私有(private)”方法
在_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
不是“私有(private)变量”,这些“类”也不是——因为 JavaScript 两者都没有。您可以非正式地讨论私有(private)变量或类,但是忘记这些概念不能完美地从其他语言继承下来是非常危险的,正如您在这里所经历的那样。
self
是一个由 getType
方法封闭的局部变量。评价是这样的:
- 评估
Sup
赋值右侧的 IIFE: self
是一个局部变量(我们称之为SupSelf
)sup
构造函数已定义getType
方法附加在其上;getType
函数是一个闭包,关闭于SupSelf
sup
原型(prototype)从 IIFE 返回,并分配给Sup
。
当您调用sub.getType()
时:
- 将
this
设置为sub
,并评估Sup.prototype.getType
: - 在
getType
内部,self
是封闭的SupSelf
,它获得了分配给它的值Sup
通过new Sup()
。它无法读取Sub
内的值self
,因为它不是本地的。
关于javascript - 为什么在声明子类时我的 Javascript 父作用域被覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35053021/