首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建具有类似于C++类私有的隐私和原型(模板)的对象

创建具有类似于C++类私有的隐私和原型(模板)的对象
EN

Stack Overflow用户
提问于 2011-12-24 19:23:15
回答 4查看 378关注 0票数 1

**编辑--在answers...but中没有明确说明这一点,您不能有“模板化(即不复制每个实例)”的私有成员,而不能有一个自动执行函数。您将使用处理器时间和代码复杂性来支付隐私。

就像一个C++私有类成员。

我一直在试图确定创建类的实际“黑客”是什么,似乎有超过10种定义类的方式。

我正在寻找的类类型提供了隐私、模块化和模板机制。Javascript有创建这种模板机制的原型。但是,我目前正在使用的解决方案没有私有成员。

如果没有,我必须问这个问题,如果我将所有的javascript移到这个类中,那么代价是什么? type...where每个都是一个自动执行的函数。现在,当我的代码加载时,所有这些都必须在可以使用之前运行。

为了更好的编程实践,这一代价是一种权衡。现在,我有适当的课程与隐私。

这个费用值得吗?额外的运行时间值得隐私吗?

以下是一些类似的问题:

目前的方法-缺乏privacy...is传播out..ie。不包含在副词中

代码语言:javascript
复制
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] );
};
EN

回答 4

Stack Overflow用户

发布于 2011-12-24 20:01:30

Javascript有创建这种模板机制的原型。但是,我目前正在使用的解决方案没有私有成员。

我所知道的使用原型和私有状态的唯一机制是WeakMaps。

这基本上包括在原型的范围内有一个本地WeakMap。

免责声明: WeakMaps是ES6,我相信目前只有firefox 6有一个实现,但是他们可以摇曳

代码语言:javascript
复制
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实用程序,代码如下所示:

代码语言:javascript
复制
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有两个函数调用的计算开销。这一点不应被忽视。

还请注意,使用弱映射比使用闭包占用内存开销要小得多,因为您仍然使用函数的原型,并且只对状态使用弱映射。

这个费用值得吗?额外的运行时间值得隐私吗?

就我个人而言,我认为“隐私”的运行时惩罚是需要衡量的。计算开销很小,内存使用的开销也很小。

票数 4
EN

Stack Overflow用户

发布于 2011-12-24 19:34:07

所以,我用的表格是:

代码语言:javascript
复制
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值。但是,这并不像您所希望的那样得到很好的支持,而且可能会使您在编写代码的方式上更加严格。

票数 0
EN

Stack Overflow用户

发布于 2011-12-24 19:35:31

在构造函数中,在该函数中声明的任何变量实际上都是私有的--它的作用域仅限于该实例,即:

代码语言:javascript
复制
var Message = function( div ) 
{
    var private = "hello, world!";
    this.div = document.getElementById( div ); 
};

但是,这些变量非常私有,无法从随后添加到原型中的函数访问它们。

访问它们的唯一方法是通过所谓的“特权方法”,即那些作为对象内的this属性创建的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8626453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档