Javascript 如何显式创建实例变量?

Javascript 如何显式创建实例变量?,javascript,Javascript,我使用的自定义框架如下所示: var SForm = $A.support({ Name: 'SForm', // instance based // hidden, created by using this // static based S: { google: 'https://plus.google.com/_/favicon?domain=', pre_url: /(http:)|(https

我使用的自定义框架如下所示:

var SForm = $A.support({

    Name: 'SForm',

    // instance based

    // hidden, created by using this

    // static based

    S: {
        google:    'https://plus.google.com/_/favicon?domain=',
        pre_url:   /(http:)|(https:)\/\//,
        domain:    /:\/\/(www\.)?([\.a-zA-Z0-9\-]+)/,

        // the good parts has good url regex - implement it some time

        url:       /:\/\/(www\.)?[\x00-\x7F]{1,1800}\.[\x00-\x7F]{1,200}/,
        email:     /\S{1,64}@[\x00-\x7F]{1,255}\.[\x00-\x7F]{1,255}/,
        tweet:     /\S{1,40}/,
        title:     /\S{1,32}/,
        name:      /\S{1,64}/,
        pass:      /\S{6,20}/,
        empty:     /\S+/
    },
    constructor : function (form_elements) {
        $A.someKey(form_elements, function (val) {
            if (val.type !== 'checkbox') {
                this.form_obj[val.name] = val.value;
            } else if (val.type === 'checkbox') {
                this.form_obj[val.name] = val.checked;
            }
        }, this);
    },

    // ... more 
这对我来说很有用,因为我可以稍微模仿一下Java类系统

但是,我不知道如何使实例变量显式,就像静态变量一样

以下是框架:

$P.block = $P.support = $P.parsel = function (obj, config_module) {
    $R.Parsel[obj.Name] = obj;

    // all properties are private

    if (!config_module) {
        return undefined;
    }

    // all properties are public

    if (config_module === true) {
        return obj;
    }

    // constructor based, all properties are public

    if (config_module === 'constructor') {
        var object_public;
        if (obj.constructor) {
            object_public = obj.constructor;
            delete obj.constructor;
        }
        $A.someKey(obj, function (val, key) {
            if (/^s_/.test(key)) {
                object_public[key] = val;
            } else if (/^p_/.test(key)) {
                object_public.prototype[key] = val;
            } else {
                object_public.prototype[key] = val;
            }

        });
        return object_public;
    }
};

我不太确定你的问题是什么,但看看你之前的问题,你似乎在回避,或者没有意识到JavaScript的面向对象特性

这里有一个例子,我希望它能帮助你

// Define constructor function
function Child(name) {
    // Check if "static" count exists.
    if (typeof Child.count === "undefined") Child.count = 0;

    // Assign instance variable
    this.name = name;
    Child.count++;
}

var alice, bob;

alice = new Child("Alice");
console.log(alice.name) // ==> "Alice"
console.log(Child.count) // ==> 1

bob = new Child("Bob");
console.log(alice.name) // ==> "Bob"
console.log(Child.count) // ==> 2

更新:使用 如果您真的想拥有在函数外部无法访问的私有变量,可以使用闭包将变量的作用域限制在该作用域内

var Child = (function() {
    // Private static variable
    var count = 0;

    function constructor(name) {
        // Public static variable
        constructor.likes = ['toys', 'candy', 'pets', 'coloring'];

        // Instance variable
        this.name = name;

        // Accessor methods
        this.getCount = function() {
            return count;
        }

        this.getLikes = function() {
            return constructor.likes;
        }

        count++;
    }

    // Return the constructor function
    return constructor;
})()

这就是为什么这些问题在不列颠哥伦比亚省被关闭。它们引起了争论,有些人喜欢模仿Java类系统,有些人不喜欢。两者都不是对的,也不是错的。错的是,争论它,而不仅仅是帮助。不知道你想做什么。您是否正在尝试创建可以从prototype访问的私有实例特定变量?如果是这样,你就不能。如果您想使用特定于实例的私有变量,那么请忘记prototype(坏主意),或者像其他许多人一样使用
this.\u myprivate
语法。不知道你是否回复了我,但这些是你的选择。如果您需要专用实例,并且您有需要访问它们的函数,那么您不能将这些函数放在原型中。非实例特定的隐私可以在原型中使用(链接发布在“不需要实例特定的隐私”下)。如果你想增加内存使用率和cpu成本来模拟JS中的私密空间,那完全取决于你。我不知道你们项目的设计。就我个人而言,我从来没有遇到过需要它的情况。我会继续做下去,并做好标记。但是我没有任何迹象表明你读过我上面的代码。你知道我是如何实现纯私有和纯公共类的吗?我应该调用$A.support,$A.klass。但是作为回应,我意识到JavaScript的OO本质,我发现它本身没有用处,有很多方法可以在此基础上进行构建。显然,我喜欢我构建的东西,因为我可以构建完全私有的模块,也可以构建完全公共的模块。我更新了答案,展示了如何使用javascript功能端的闭包实现私有和公共静态变量,但仍然利用OO特性来提供实例变量。