これは私が地元のフィールドに使用したものである:
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" },
}, this);
}
をそしてVSゲッターとセッターのように、あなたは呼ぶことにします:
var alex = new Person();
alex.Name = "Alex Ramsi";
console.clear();
console.info(alex.Name);
帯域幅の負荷を軽減したいという趣旨に部分的に関係していると思われます。余分なマークアップとは、配線の余分なビットを意味します。このような小さな例の場合は、数万行に及ぶ堅牢なアプリケーションでは重要ではない可能性があります。 – Shmiddty
余分な定義は、私の前のコメントと同じ行に沿って、クライアント上の余分なメモリ使用量を意味します。 – Shmiddty
私はすでに回答が得られていると思いますが、意見に基づく回答を得やすいので、これは良い質問ではありません。実際には – madth3