2015-05-16 4 views
4

Я много читал о JS аксессорах здесь и выяснить это будет хорошо для меня:Javascript за собственность методы доступа

Это то, что я использовал для локальных полей:

TYPE_DEFAULT_VALUE= { 
    number: 0, 
    string: "", 
    array: [], 
    object: {}, 
}; 

typeOf = function (object) { 
    if (typeof object === "number" && isNaN(object)) 
     return NaN; 
    try { 
     return Object.prototype.toString.call(object).slice(8, -1).toLowerCase(); 
    } 
    catch(ex) { 
     return "N/A"; 
    }; 
}; 

getAccessor = function(obj, key, type, defaultValue) { 
    if (defaultValue === undefined) 
     defaultValue = TYPE_DEFAULT_VALUE[type] === undefined ? null : TYPE_DEFAULT_VALUE[type]; 
    return { 
     enumerable: true, 
     configurable: true, 
     get: function() { 
      if (obj[key] === undefined) 
       obj[key] = defaultValue; 
      return obj[key]; 
     }, 
     set: function (value) { 
      if (typeOf(value) === type) 
       obj[key] = value; 
     }, 
    }; 
} 

LocalFields = function (fields, object) { 
    /** 
    * field properties 
    * { 
    * type: [ required ] (number | string | array | object | ...), 
    * defaultValue: [ optional ] 
    * } 
    */ 
    if (! fields) 
     throw "Too few parameters ..."; 
    if (! object) 
     object = this; 

    var obj = this; 
    var fieldsAccessor = {}; 
    for(key in fields){ 
     field = fields[key]; 
     fieldHandler = key[0].toUpperCase() + key.substr(1); 
     if(! field.type) 
      throw "Type not set for field: " + key; 

     fieldsAccessor[fieldHandler] = getAccessor(obj, fieldHandler, field.type, field.defaultValue) 
    } 
    Object.defineProperties(object, fieldsAccessor); 
} 

Теперь для каждого класса I можно просто назвать что-то вроде:

Person = function(){ 
    new LocalFields({ 
     id:  { type: "number" }, 
     name: { type: "string" }, 
     phone: { type: "array" }, 
    }, this); 
} 

и тогда как VS-акцессоры вы звоните:

var alex = new Person(); 
alex.Name = "Alex Ramsi"; 
console.clear(); 
console.info(alex.Name); 

это работает для всех типов, но есть проблема, потому что getter и setter - это основная операция, и что, если я хочу добавить поле массива и вызвать этот метод append или даже preend, все равно так или иначе? Например Как я могу назвать:

 alex.Phone.append('+1234567890'); 

ответ

0

Это хорошее усилие, но вы забыли, что нет никакой функции Append для списка массива! Вы можете использовать push и любые другие функции массива. Проверьте его снова;

+0

Вы уверены? Позволь мне проверить. –

+0

Да, вы правы. Я пробовал эту ночь и назвал append вместо push. –

Смежные вопросы