【发布时间】:2016-05-05 07:53:35
【问题描述】:
我有两个 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的每个实例相关联的私有变量。 -
我喜欢将所有类定义包含在
(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
【问题讨论】:
-
当
Sub调用Sup.call(self)时,Sup中的this与Sub中的self相同。只有一个对象,不是两个对象,它只能有一个type属性。 -
"一个绑定到每个 Sup 实例的私有变量。" - 不。鉴于它是在构造函数之外声明的,它只不过是一个 static “私有”变量,保存最后构造的实例。
-
@Barmar @Bergi:谢谢,我想我把实例对象和它的工厂混为一谈了——
sup是实例,Sup是工厂,self指的是Sup.然后,如果我删除了self,它并没有像我想象的那样做,还有什么办法可以访问从工厂创建的对象,就像在_getType()函数中一样?
标签: javascript oop inheritance scope