**编辑--在answers...but中没有明确说明这一点,您不能有“模板化(即不复制每个实例)”的私有成员,而不能有一个自动执行函数。您将使用处理器时间和代码复杂性来支付隐私。
就像一个C++私有类成员。
我一直在试图确定创建类的实际“黑客”是什么,似乎有超过10种定义类的方式。
我正在寻找的类类型提供了隐私、模块化和模板机制。Javascript有创建这种模板机制的原型。但是,我目前正在使用的解决方案没有私有成员。
如果没有,我必须问这个问题,如果我将所有的javascript移到这个类中,那么代价是什么? type...where每个都是一个自动执行的函数。现在,当我的代码加载时,所有这些都必须在可以使用之前运行。
为了更好的编程实践,这一代价是一种权衡。现在,我有适当的课程与隐私。
这个费用值得吗?额外的运行时间值得隐私吗?
以下是一些类似的问题:
目前的方法-缺乏privacy...is传播out..ie。不包含在副词中
var Message = function( div )
{
this.div = document.getElementById( div );
};
Message.prototype.messages =
{
name: 'Please enter a valid name',
email: 'Please enter a valid email',
pass: 'Please enter passoword, 6-40 characters',
url: 'Pleae enter a valid url',
title: 'Pleae enter a valid title',
tweet: 'Please enter a valid tweet',
empty: 'Please complete all fields',
same: 'Please make emails equal',
taken: 'Sorry, that email is taken',
validate: 'Please contact <a class="d" href="mailto:support@host.com">support</a> to reset your password'
};
Message.prototype.display = function( type )
{
Control.sendInner( this.div, this.messages[type] );
};发布于 2011-12-24 20:01:30
Javascript有创建这种模板机制的原型。但是,我目前正在使用的解决方案没有私有成员。
我所知道的使用原型和私有状态的唯一机制是WeakMaps。
这基本上包括在原型的范围内有一个本地WeakMap。
免责声明: WeakMaps是ES6,我相信目前只有firefox 6有一个实现,但是他们可以摇曳
var Message = (function() {
var map = new WeakMap();
var Message = function(div) {
var privates = {};
map.set(this, privates);
privates.div = document.getElementById(div);
};
Message.prototype.messages = {
name: 'Please enter a valid name',
email: 'Please enter a valid email',
pass: 'Please enter passoword, 6-40 characters',
url: 'Pleae enter a valid url',
title: 'Pleae enter a valid title',
tweet: 'Please enter a valid tweet',
empty: 'Please complete all fields',
same: 'Please make emails equal',
taken: 'Sorry, that email is taken',
validate: 'Please contact <a class="d" href="mailto:support@host.com">support</a> to reset your password'
};
Message.prototype.display = function(type) {
var privates = map.get(this);
Control.sendInner(privates.div, this.messages[type]);
};
return Message;
}());请注意,WeakMaps是ES6,从弱映射而不是从this获取对象有很大的计算开销。
我有一篇关于模仿WeakMaps - 原型和私营化状态的文章。
使用本文中提到的klass实用程序,代码如下所示:
var Message = klass(function(privates) {
return {
constructor: function(div) {
privates(this).div = document.getElementById(div);
},
messages: {
name: 'Please enter a valid name',
email: 'Please enter a valid email',
pass: 'Please enter passoword, 6-40 characters',
url: 'Pleae enter a valid url',
title: 'Pleae enter a valid title',
tweet: 'Please enter a valid tweet',
empty: 'Please complete all fields',
same: 'Please make emails equal',
taken: 'Sorry, that email is taken',
validate: 'Please contact <a class="d" href="mailto:support@host.com">support</a> to reset your password'
},
display = function(type) {
Control.sendInner(privates(this).div, this.messages[type]);
}
};
});同样,使用privates(this).x而不是this.x有两个函数调用的计算开销。这一点不应被忽视。
还请注意,使用弱映射比使用闭包占用内存开销要小得多,因为您仍然使用函数的原型,并且只对状态使用弱映射。
这个费用值得吗?额外的运行时间值得隐私吗?
就我个人而言,我认为“隐私”的运行时惩罚是需要衡量的。计算开销很小,内存使用的开销也很小。
发布于 2011-12-24 19:34:07
所以,我用的表格是:
var Message = function (div) {
this.div = document.getElementById(div);
// messages will be 'private'
var messages = { 'name' : 'Please enter ...' }; // You get the picture here
this.display = function (type) {
Control.sendInner(this.div, messages);
}
}您可以在对象范围标头下阅读有关私有、静态和公共变量在这个岗位上的更多信息。
更新:您也可以使用严格模式并设置不可写变量,或者只设置一个getter值。但是,这并不像您所希望的那样得到很好的支持,而且可能会使您在编写代码的方式上更加严格。
发布于 2011-12-24 19:35:31
在构造函数中,在该函数中声明的任何变量实际上都是私有的--它的作用域仅限于该实例,即:
var Message = function( div )
{
var private = "hello, world!";
this.div = document.getElementById( div );
};但是,这些变量非常私有,无法从随后添加到原型中的函数访问它们。
访问它们的唯一方法是通过所谓的“特权方法”,即那些作为对象内的this属性创建的方法。
https://stackoverflow.com/questions/8626453
复制相似问题