我应该在原型中添加内部属性吗?
Should I add *internal* properties to the prototype?
我知道使用原型的结果是所有添加的属性和方法都将是公共的。这并不是一个太大的问题,因为我正在使用命名约定来区分内部接口和公共接口。所以,是的,从技术上讲,所有东西仍然是公开的。
是否最好将所有方法和属性添加到原型中——甚至那些打算是内部的——而不是仅将公共方法/属性添加到原型中并使用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()是公有的
相关文章:
- Javascript:循环属性内部的条件递增或递减
- javascript正则表达式,用于编辑元素内部的css样式属性
- 通过 Jquery 调用 tr 属性并找到我的内部复选框
- 在 Forerunner 数据库集合中创建主键时,key 属性是否可以位于集合对象的对象内部
- 为什么我不能在变量上使用内部HTML属性
- 如何从类函数内部访问对象属性
- 如何在firebase中通过内部属性进行过滤
- 为什么可以在内部函数成员中访问对象引用,而不能在内部属性成员中访问
- 如果我们使用:运算符在函数内部定义一个属性,会发生什么
- 如何使用jQuery访问属于函数内部另一个函数的对象的属性
- 对象属性不是在工厂成员函数内部创建的
- PhantomJS中的evalute内部未定义属性
- 更改RTE内部的类和样式属性(designMode打开)
- 重写内部 HTML 属性访问
- 我可以将 HTML 字符串分配给 HTML DOM 节点的内部 HTML 属性吗?
- Javascript:如何通过其参数选择函数内部属性
- Angular 指令内部 HTML 重新编译,动态创建绑定属性
- Angular 1.5:访问控制器内部的绑定控制器属性
- 浏览器如何从内部HTML属性更新DOM
- Javascript在属性内部发布属性时变得“未定义”