簡體   English   中英

JavaScript構造函數和屬性以及對象屬性的可見性

[英]JavaScript constructor and properties and object attributes visibility

我想知道是否有可能在對象中使用局部變量(var),以使其從外部不可見,並同時在其上放置屬性(get,set方法): jsfiddle.net/9jT3B在示例中的日志中的所有日期都將是相同的,我認為這是因為我在defineProperties函數中使用了Leave對象的原型,不是嗎?

先感謝您。

var a = [
{
    "u": 0,
    "l": [
        { "start": new Date(2013, 9, 25), "end": new Date(2013, 10, 2), "type": "B", "desc": "" },
        { "start": new Date(2013, 10, 3), "end": new Date(2013, 10, 3), "type": "O", "desc": "Description 1" },
        { "start": new Date(2013, 10, 9), "end": new Date(2013, 10, 10), "type": "T", "desc": "" },
        { "start": new Date(2013, 10, 23), "end": new Date(2013, 10, 28), "type": "S", "desc": "" },
        { "start": new Date(2013, 10, 29), "end": new Date(2013, 11, 10), "type": "O", "desc": "Description 2" }
    ]
},
{
    "u": 1,
    "l": [
        { "start": new Date(2013, 10, 14), "end": new Date(2013, 10, 14), "type": "S", "desc": "" },
        { "start": new Date(2013, 10, 20), "end": new Date(2013, 10, 30), "type": "B", "desc": "" }
    ]
}
];

function Leave (id, start, end, type, desc, ghost) {
    var _id = id;
    var _start = start;
    var _end = end;
    var _type = type;
    var _desc = desc;
    var _ghost = ghost !== undefined ? ghost : false;

    Object.defineProperties(Leave.prototype, {
        start: {
            set: function (x) {
                _start = x;
            },
            get: function () {
                return _start;
            },
            enumerable: true,
            configurable: true
        },
        end: {
            set: function (x) {
                _end = x;
            },
            get: function () {
                return _end;
            },
            enumerable: true,
            configurable: true
        },
        type: {
            set: function (x) {
                _type = x;
            },
            get: function () {
                return _type;
            },
            enumerable: true,
            configurable: true
        },
        desc: {
            set: function (x) {
                _desc = x;
            },
            get: function () {
                return _desc;
            },
            enumerable: true,
            configurable: true
        }
    });
};

var b = [];
function load(json) {
for(var i = 0; i < json.length; i++) {
    var u = [json[i].u, [[], [], [], [], [], [], [], [], [], [], [], []]];
    for(var j = 0; j < json[i].l.length; j++) {
        var act = new Leave("", json[i].l[j].start, json[i].l[j].end, json[i].l[j].type,  json[i].l[j].desc);
        u[1][json[i].l[j].start.getMonth()].push(act);
    }
    b.push(u);
}
}
load(a);
console.log(b);

我不確定您要在這里做什么,但是請告訴我這是否有助於回答您的問題。

//Any variables declined outside the function are in the global namespace and accessible   anywhere else
var globalPublicVariables ='You can See me'

var objectPrototype = function(id, start, end, type, desc, ghost){
    //You don't need to redefine the input values they are already set to this id if they are passed
    //You just need to do the check for ghost to set it to a default value of false
    ghost = ghost||false;

    //Any Variables you define inside the function are private to that function
    var _privateVariable = 'You can\'t see me';

    //Any functions defined in here and not returned are not public
    var _privateFunction = function(){
        return _privateVariable;
    };

    //I like to create a public object that is returned containing any public functions or variables you want accessible outside the prototype
    var publicObject = {};

        //Any Variable assigned to this object will be public.
        publicObject.prototypePublicVariable = 'I am publicly accessible and editable';

        //Any Function assigned to this object will be publicly accessible
        publicObject.prototypePublicFunction = function(){
            tempReturn = _privateVariable+' but now you can'
            return _privateVariable;
        };

    //return the publicObject to make properties of it publicly accessible
    return publicObject;
};

objectPrototype.prototypePublicVariable; //returns 'I am publicly accessible and editable'
objectPrototype.prototypePublicFunction; //returns 'You can\'t see me but now you can'

objectPrototype._privateVariable; //This is not accessible outside the function.
objectPrototype._privateFunction; //This is not accessible outside the function.

//If you want to actually create new instances of a prototype then use this
var newPrototype = new objectPrototype();

//Now you can use
newPrototype.prototypePublicVariable; //returns 'I am publicly accessible and editable'
newPrototype.prototypePublicFunction; //returns 'You can\'t see me but now you can'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM