繁体   English   中英

声明子类时,为什么我的Javascript父范围会被覆盖?

[英]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(){})()结构的同时解决该问题吗?


编辑:回答如何调用(我称之为)“私有”方法

_getTypethis将引用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM