我知道使用原型的结果是所有添加的属性和方法都是公开的。这不是一个太大的问题,因为我使用命名约定来区分内部和公共接口。所以,是的,一切仍然技术上公开。
最好只将所有方法和属性添加到原型中 - 即使是那些旨在内部的方法和属性 - 反对只添加 public 方法/原型的属性,并使用this.property = value
在构造函数内动态创建内部属性。?
似乎既然一切都将是公开的,我们也可以在原型中添加内部属性。
我知道使用闭包来创建私有范围。我的问题不是关于如何创建真正的私有属性(这意味着放弃原型,因为任何这些方法都没有内部访问权限),而是关于使用原型时的最佳实践。
function MyObjectA() {
this.myInternalProp_ = 5;
// ...
}
MyObjectA.prototype.myPublicProp = "Hello";
VS
function MyObjectA() {
// ...
}
MyObjectA.prototype.myPublicProp = "Hello";
MyObjectA.prototype.myInternalProp_ = 5;
答案 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