Javascript 我应该向原型添加*内部*属性吗?

Javascript 我应该向原型添加*内部*属性吗?,javascript,Javascript,我知道使用原型的结果是所有添加的属性和方法都是公共的。这并不是什么大问题,因为我使用命名约定来区分内部接口和公共接口。所以,是的,从技术上讲,一切都是公开的 将所有的方法和属性添加到原型中,甚至是打算内部的方法和属性,而不是只将公共方法/属性添加到原型中,并使用this.property=value在构造函数中动态创建内部属性,这是最好的做法吗 看起来,既然一切都将是公开的,那么我们也可以向原型添加内部属性 我知道如何使用闭包创建私有范围。我的问题不是关于如何创建真正私有的属性(这意味着放弃原型

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

将所有的方法和属性添加到原型中,甚至是打算内部的方法和属性,而不是只将公共方法/属性添加到原型中,并使用
this.property=value
在构造函数中动态创建内部属性,这是最好的做法吗

看起来,既然一切都将是公开的,那么我们也可以向原型添加内部属性

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

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

MyObjectA.prototype.myPublicProp = "Hello";
vs

您可以通过将“私有”变量作为变量添加到contrustor而不是这样做来创建“私有”变量;像这样:

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;
函数MyObject()
{
this.readableVar=“是,这是可读的”;
var notReadable=“不,不可读”;
};
var ob=新的MyObject();
document.body.innerHTML=ob.readableVar+“
”+ob.notReadable;
这些将不会共享,因此特定于使用new创建的实例

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

希望对PM5544有帮助

您可以将“私有”变量作为变量添加到控制器中,而不是这样做;像这样:

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;
函数MyObject()
{
this.readableVar=“是,这是可读的”;
var notReadable=“不,不可读”;
};
var ob=新的MyObject();
document.body.innerHTML=ob.readableVar+“
”+ob.notReadable;
这些将不会共享,因此特定于使用new创建的实例

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


希望对PM5544有帮助

我喜欢以下模式:

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

_x和y将是私有的,area()将是公共的。

我喜欢以下模式:

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

_x和y将是私有的,area()将是公共的。

在原型上放置属性意味着这些属性不仅是公共的,而且是共享的。如果您的属性是可变类型,例如
日期
,则会出现问题:

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

另请参见

在原型上放置属性意味着这些属性不仅是公共的,而且是共享的。如果您的属性是可变类型,例如
日期
,则会出现问题:

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

另请参见

能否提供一个代码示例?我看不出问题是什么。你是在问是否应该使用可用的语言结构来隐藏信息,还是不应该?@RichardJPLeGuen问题是这样的。我们应该避免在构造函数中动态创建新属性。我应该把所有的东西都放在原型上吗。这样就不会动态创建属性;也就是说,在原型成型之后。例如,执行
this.myNewProp=value
会触发我的对象的引擎模型,它必须重建它的隐藏类。这并不是我主要关心的问题,因为我很好奇人们从一致性、维护的角度看会怎么想。仅供参考,当我问这个问题时,我有点困惑;)你能提供一个代码示例吗?我不明白问题是什么。你是在问是否应该使用可用的语言结构来隐藏信息,还是不应该?@RichardJPLeGuen问题是这样的。我们应该避免在构造函数中动态创建新属性。我应该把所有的东西都放在原型上吗。这样就不会动态创建属性;也就是说,在原型成型之后。例如,执行
this.myNewProp=value
会触发我的对象的引擎模型,它必须重建它的隐藏类。这并不是我主要关心的问题,因为我很好奇人们从一致性、维护的角度看会怎么想。仅供参考,当我问这个问题时,我有点困惑;)谢谢你的快速回复。然而,我确实希望采用原型方法。我只是想知道我是应该把所有的属性都放在原型上,还是只放那些打算公开的属性。在使用原型时,更多的是一个最佳实践问题。这些概念可以一起使用,例如,您可以创建一个构造函数,其中包含实例中所有共享的公共内容和私有内容的原型。但是试着回答你的问题:你把变量放在哪里都取决于数据模型,所以它总是一个变量可访问性、易用性、可维护性和性能的问题。所以我想每种情况都是不同的,需要不同的方法。也许我们可以用一些例子来阐述一些……谢谢。我知道中间解决方案。虽然这并不是很有帮助,因为原型上的方法无法访问私有闭包实例变量。它们将是不受特权的公共方法。老实说,我也喜欢你提出的解决方案。我们需要稍微增加内存开销