我有这个JavaScript:
var Type = function(name) {
this.name = name;
};
var t = new Type();
现在我想补充一点:
var wrap = function(cls) {
// ... wrap constructor of Type ...
this.extraField = 1;
};
所以,我可以这样做:
wrap(Type);
var t = new Type();
assertEquals(1, t.extraField);
[编辑]我想实例属性,而不是一个类(静态/共享)属性。
在包装函数执行的代码应该工作就好像我粘贴它变成真正的构造函数。
该类型的Type
不应该改变。
更新: 更新的版本在这里
你实际上是在寻找为扩展型到另一个类。 有很多方法可以做到这在JavaScript中。 我不是一个真正的迷new
和prototype
建筑“类”的方法(我更喜欢寄生继承样式更好),但这里是我的了:
//your original class
var Type = function(name) {
this.name = name;
};
//our extend function
var extend = function(cls) {
//which returns a constructor
function foo() {
//that calls the parent constructor with itself as scope
cls.apply(this, arguments)
//the additional field
this.extraField = 1;
}
//make the prototype an instance of the old class
foo.prototype = Object.create(cls.prototype);
return foo;
};
//so lets extend Type into newType
var newType = extend(Type);
//create an instance of newType and old Type
var t = new Type('bar');
var n = new newType('foo');
console.log(t);
console.log(t instanceof Type);
console.log(n);
console.log(n instanceof newType);
console.log(n instanceof Type);