javascript - 为什么在声明子类时我的 Javascript 父作用域被覆盖?

标签 javascript oop inheritance scope

我有两个 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/

相关文章:

oop - vbscript静态类变量/方法?

c++ - 指向派生类成员函数的指针,但不是派生(虚拟)函数

javascript - 需要重新加载 jquery 来执行该功能

javascript - 将值从函数内部传递给 JavaScript 中的参数

javascript - asp.Net 阻止服务器端与 javascript 的链接

c++ - 错误 : illegal use of this type as an expression. C++

python - __init__ 是类方法吗?

javascript - 尝试访问 json 列表时显示文本 'Undefined'

PHP,命名空间中的新变量类

java - 当我可以通过引用子类访问所有方法时,为什么还要引用基类?