我应该在原型中添加内部属性吗?

Should I add *internal* properties to the prototype?

本文关键字:属性 内部 添加 原型 我应该      更新时间:2023-09-26

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

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

看来既然一切都将是公共的,我们不妨也给原型添加内部属性。

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

function MyObjectA() {
   this.myInternalProp_ = 5;
   // ...
}
MyObjectA.prototype.myPublicProp = "Hello";

function MyObjectA() {
   // ...
}
MyObjectA.prototype.myPublicProp = "Hello";
MyObjectA.prototype.myInternalProp_ = 5;

在原型上放置属性意味着这些属性不仅是公共的,而且是共享的。当属性是可变类型(如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"为变量

你可以把"private"变量作为var添加到构造器中,而不是做this.something;像这样:

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创建的实例。

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

希望对PM5544有所帮助。

我喜欢下面的样式:

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

_x和_y是私有的,area()是公有的