超出属性访问者的Javascript

时间:2015-05-16 10:57:54

标签: javascript arrays json accessor

我在这里阅读了很多关于JS访问器的内容,并认为这对我有好处:

这是我用于本地字段的内容:

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

现在每个班级我都可以打电话给:

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

然后就像VS getter和setter一样,你会打电话:

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

这适用于所有类型,但有一个问题,因为getter和setter是基本操作,如果我想添加一个数组字段并调用这个append方法甚至prepend,无论如何还有什么呢? 例如,我该怎么称呼:

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

1 个答案:

答案 0 :(得分:-1)

这是一个很好的努力,但你忘了数组列表没有附加功能! 您可以使用push和任何其他阵列功能。再检查一下;