2013-11-27 165 views
0

我想知道是否有可能在對象中使用本地變量(var),以便從外部不可見並將屬性(get,set方法)放在該對象上在同一時間:jsfiddle.net/9jT3B 在日誌中的例子所有日期將是相同的,我認爲這是因爲我在defineProperties函數中使用了Leave對象的原型,不是嗎?JavaScript的構造函數和屬性和對象屬性的可見性

預先感謝您。

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); 

回答

1

我不確定你在這裏想做什麼,但讓我知道如果這有助於回答你的問題。

//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' 
+0

是的,我想要的對象變量是函數外部訪問只是它們的屬性。謝謝。 – sada