我有一个类定义,它是类定义的一部分。
var someObject = {
someClass: function() {
this.someMethod = function() {
alert('hello');
};
}
}
我被告知我应该使用prototype来添加方法,因为它只需要为对象的所有实例创建一次。问题是我似乎需要在定义构造函数之后添加prototyped方法,就像这样......
var someObject = {
someClass: function() {
}
}
someObject.someClass.prototype.someMethod = function() {
alert('hello');
};
理想情况下,我想在构造函数中定义原型方法,就像这样......
var someObject = {
someClass: function() {
this.prototype.someMethod = function() {
alert('hello');
};
}
}
这会导致错误,但声明原型为null或不是对象。有没有办法实现我想要的,或者这是不可能的?
答案 0 :(得分:1)
是的,你不能在类的构造函数中访问prototype属性,但你可以做一些不同的代码表示法,所以它可能对你有帮助:
var someObject = {
someClass: (function wrapper() {
var ctor = function(){};
ctor.prototype.someMethod = function(){
alert('hello');
};
return ctor;
})()
}
答案 1 :(得分:1)
您可以使用arguments.callee
或 - 如果您不覆盖构造函数的.prototype
属性 - this.constructor
而不是普通this
,即可
var someObject = {
someClass: function() {
// this.constructor.prototype should work as well
arguments.callee.prototype.someMethod = function() {
alert('hello');
};
}
};
然而,将函数表达式放回到构造函数中会破坏练习的整个目的 - 将原型中的函数对象的引用存储到实例中并不重要,您仍然在创建一个新的每个构造函数调用一个!
一种可能的解决方案是使用匿名构造函数而不是对象文字,从而为您提供免费的额外范围:
var someObject = new (function() {
function someClass() {}
someClass.prototype.someMethod = function() {
alert('hello');
};
this.someClass = someClass;
});
有关使用对象文字和包装函数的等效解决方案,请参阅Paul's answer,这可能更为熟悉。