带有实例变量的简单JavaScript继承

带有实例变量的简单JavaScript继承,javascript,inheritance,private-members,Javascript,Inheritance,Private Members,我正在尝试使用: 我发现真正有限的是,变量对于对象的实例不是私有的。 这个简单的事实是一个人选择采用这种方法的关键因素之一 我在链接页面的评论中看到有人提出以下建议: init: function() { // Private var var _div = $( div ); // Priviledged method accesses private var this.getDiv = function () { return _div; } this.setDiv =

我正在尝试使用:

我发现真正有限的是,变量对于对象的实例不是私有的。 这个简单的事实是一个人选择采用这种方法的关键因素之一

我在链接页面的评论中看到有人提出以下建议:

init: function() {
  // Private var
  var _div = $( div );
  // Priviledged method accesses private var
  this.getDiv = function () { return _div; }
  this.setDiv = function (div) { _div = div; }
  // other initialization stuff
}
我对这种方法有些怀疑:

  • 在我声明的类中,是否需要始终通过setter和getter访问这些变量
  • 如何在内部函数的定义中使用这些变量
  • 比如说:

    node.append("title").text(function(d) { /* use private variable */ });
    
    var Person = Class.extend({
        init: function() {
            this._name;
        },
        printNameOnClick: function() {
            var thiz = this;
            document.getElementById('nameDiv').addEventListener("click", function() {
                document.getElementById('nameDiv').innerHTML = thiz.name;
            });
        }
    }
    
    有人克服了这个限制吗

    谢谢并致以最良好的问候


    Sergio

    Javascript确实不能很好地处理私有实例变量。可以装起来,但有毛。为了真正做到这一点,您必须在初始值设定项中创建所有方法

    var Foo = function() {
      var bar = 9;
    
      this.squarePrivate = function() {
        return bar * bar;
      };
    }
    
    new Foo().squarePrivate() //=> 81
    
    这意味着每个函数都必须在实例构造函数的作用域中创建,因此它可以访问这些本地变量。因此实例化对象的速度较慢

    如果像现在这样使用基于类或原型风格的方法,就无法很好地处理私有实例变量

    使用构造函数中创建的getter/setter方法可以工作,但是这些getter和setter是公共的,因此它不允许隐藏值,只允许用逻辑包装其get和set。如果你把接受者和接受者保持原样,那么就没有必要把它们变成私人的

    一个常见的惯例是在私有属性的前面加下划线,这告诉人们不要弄乱它。但是,如果公开数据是出于安全考虑,那么这显然是个坏主意

    init: function() {
      this._bar = 9; // people will see instance._bar, but get the hint not to touch
    },
    squarePrivate: function() {
      return this._bar * this._bar;
    }
    

    但你的问题的答案是:

    在我声明的类中,是否需要始终通过setter和getter访问这些变量

    对。只有
    init
    函数可以访问局部变量,因此在该范围内创建的setter和getter函数也可以访问该局部变量。但是这个局部变量在别处是不可访问的,所以您必须使用getter/setter

    如何在内部函数的定义中使用这些变量


    问题就在这里。如果您使用的是公共getter,请调用它们,但这意味着数据实际上是公共的。或者如果您使用我的第一个示例,只需引用本地变量。或者如果您使用带下划线的属性,只需引用它。

    首先感谢Alex的友好回复。我花了一些时间消化你对我的看法

    我想回答我的新问题,因为我有特殊的需要,我觉得这个问题一开始提得不好

    我们还要补充一点,数据隔离不是一个问题,因为在我的应用程序中,我将以友好的方式创建层次结构的实例,并对它们调用一个方法。人们最终需要提供“根”对象的新实现,我的应用程序将在需要时使用它们

    实际上,我做了一些测试,并确保init方法中声明的变量如下:

    this._instanceVar
    
    实际上由实例本身拥有。在类中声明的其他方法中,我可以通过这样简单地引用它们来访问它们

    相反,对于第二点,我找到了一个解决方案,这个解决方案并不完全吸引我,但我会坚持下去。关键是将这个复制到一个与我声明的方法的闭包相关的局部变量中。此变量允许我将内容传递给内部函数:

    例如:

    node.append("title").text(function(d) { /* use private variable */ });
    
    var Person = Class.extend({
        init: function() {
            this._name;
        },
        printNameOnClick: function() {
            var thiz = this;
            document.getElementById('nameDiv').addEventListener("click", function() {
                document.getElementById('nameDiv').innerHTML = thiz.name;
            });
        }
    }
    
    或者别的什么

    这一点的关键在于能够以实例的形式对一个特定对象的实例进行动态实例化,并在该对象上调用单个方法。 层次模型允许我确保在列表中调用顶级类中的函数

    致以最良好的祝愿

    塞尔吉奥