2014-02-06 39 views
2

我试图使用方法: Simple Javascript Inheritance by John Resig简单的JavaScript继承与实例变量

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

我见过的链接页面,有人是在暗示的意见如下:

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 
} 

我对这种做法有些疑惑:

  1. 在课堂上,我声明,我是否需要通过setter和getter来访问这些变量?
  2. 如何在内部函数的定义中使用这个变量?

比方说,例如:

node.append("title").text(function(d) { /* use private variable */ }); 

已经有人克服了这个限制吗?

感谢和问候

塞尔吉奥

回答

0

的Javascript真的没有做私人实例变量非常好。它可以装配,但它很毛茸茸。为了真正做到这一点,你必须在初始化器中创建所有的方法。

var Foo = function() { 
    var bar = 9; 

    this.squarePrivate = function() { 
    return bar * bar; 
    }; 
} 

new Foo().squarePrivate() //=> 81 

这意味着每个函数都必须在实例构造函数的范围内创建,因此它可以访问这些本地变量。因此实例化对象较慢。

如果你使用一个基于类或者样机的方式,就像你在做的那样,你不能真的做私有的实例变量。

使用在构造函数中创建的getter/setter方法可以工作,但是这些getter和setters是公共的,所以它不会允许您隐藏该值,只能包含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; 
} 

但回答您的问题:

在我声明了类,将我需要通过制定者总是访问此变量和getter?

是的。只有init函数才能访问本地变量,因此在该范围中创建的setter和getter函数也可以访问该局部变量。但是这个局部变量不会在别处访问,所以你必须使用getters/setters。

如何在内函数的定义中使用这个变量?

那么这就是整个问题。如果您使用public获得者,请致电他们,但这意味着数据是有效公开的。或者,如果你去我的第一个例子,只需引用本地变种。或者,如果您使用下划线的属性,只需引用它。

0

首先感谢Alex的回复。我花了一些时间来消化你所有的东西,虽然我。

我想回答我的问题,虽然因为我有特定的需求,我不认为这个问题一开始就构思得好。

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

其实我做了一些测试,并确保在这样的init方法声明的变量:

this._instanceVar 

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

对于第二点,相反,我找到了一个解决方案,它不会完全吸引我,但我会坚持。关键是将这个复制到一个变量局部方面,关于我声明的方法的结束。这个变量将让我的东西传递给内部函数:

例如:

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; 
     }); 
    } 
} 

或者世袭的。

虽然它能够实现一个特定对象的实例来调用单一方法,但它的全部意义在于。 分层模型允许我确定在列表中顶层类中的函数将被调用。

最好的问候,

塞尔吉奥