我应该在原型中添加* internal *属性吗?

时间:2011-11-18 20:15:18

标签: javascript

我知道使用原型的结果是所有添加的属性和方法都是公开的。这不是一个太大的问题,因为我使用命名约定来区分内部和公共接口。所以,是的,一切仍然技术上公开。

最好只将所有方法和属性添加到原型中 - 即使是那些旨在内部的方法和属性 - 反对只添加 public 方法/原型的属性,并使用this.property = value在构造函数内动态创建内部属性。?

似乎既然一切都将是公开的,我们也可以在原型中添加内部属性。

我知道使用闭包来创建私有范围。我的问题不是关于如何创建真正的私有属性(这意味着放弃原型,因为任何这些方法都没有内部访问权限),而是关于使用原型时的最佳实践。

function MyObjectA() {
   this.myInternalProp_ = 5;
   // ...
}

MyObjectA.prototype.myPublicProp = "Hello";

VS

function MyObjectA() {
   // ...
}

MyObjectA.prototype.myPublicProp = "Hello";
MyObjectA.prototype.myInternalProp_ = 5;

3 个答案:

答案 0 :(得分:1)

你可以通过将它们作为var而不是做这个来制作“私人”变种。像这样:

function MyObject()
{
    this.readableVar = "yes this is readable";
    var notReadable = "nope, not readable";  
};

var ob = new MyObject();
document.body.innerHTML = ob.readableVar + "<br />" + ob.notReadable;

这些不会被共享,因此特定于您使用new创建的实例。

使用原型继承时要记住的一件事是,每次访问不在实例内但在原型内部的var时,在链的每个步骤中都会执行查找操作,直到找到匹配项或在链接的顶部未定义返回。 重复完成后,这可能会成为开销。

希望它有助于PM5544。

答案 1 :(得分:1)

我喜欢以下模式:

function Rectangle(x,y) {
  var _x = x,
      _y = y;
  this.area = function() {
    return _x * _y;
  }
}

_x和_y将是私有的,而area()将是公开的。

答案 2 :(得分:1)

在原型上放置属性意味着属性不仅是公共属性,而且是共享。当您的属性是可变类型时,例如Date

,这就成了问题
function MyObjectA () { }  
MyObjectA.prototype.date = new Date(2011, 10, 18);
var obj1 = new MyObjectA();
var obj2 = new MyObjectA();
obj1.date.setDate(24);
console.log(obj2.date);  // Thanksgiving, not today

另见Using "prototype" for variables