我正在尝试创建一种“动态”定义类的强大方法,但我担心会给整个过程增加不必要的开销。
这是我的创作代码:
function Class(cons,proto) {
var keys = Object.keys(cons);
function _class() {
var i = keys.length;
while( i-- ) {
this[ keys[i] ] = arguments[i] || cons[keys[i]];
}
}
if(proto) {
var f;
for (f in proto) {
_class.prototype[f] = proto[ f ];
}
}
return _class
}
这就是我想用它的方式
var car = Class({
"name": "A car",
"power": 900
},
{
"honk": function() { alert("honk!") }
});
var bmw = new car("BMW", 500);
bmw.honk(); // -> honk!
console.log( bmw.name, bmw.power ); // -> BMW 500
var generic = new car();
generic.honk = function() { alert("custom honk") };
generic.honk(); // -> custom honk!
alert( bmw.honk === car.prototype.honk ); // -> true
alert( generic.honk === car.prototype.honk ); // -> false
console.log( generic.name, generic.power ); // -> A car 900
我做了什么不必要的事吗?你有什么改进建议吗? 请发表您的意见
答案 0 :(得分:1)
我做了什么不必要的事吗?
不是我能看到的,但你需要向我们展示一个实际的用例,而不是演示示例: - )
您有任何改进建议吗?
循环Object.keys(cons)
并使用i
除keys[i]
之外的其他任何内容都是错误的,因为Object.keys
不保证任何订单。 bmw.power
为"BMW"
且bmw.name
为500
也可能发生。