Javascript 在类定义中使用this.prototype?
我有一个类定义,它是类定义的一部分Javascript 在类定义中使用this.prototype?,javascript,Javascript,我有一个类定义,它是类定义的一部分 var someObject = { someClass: function() { this.someMethod = function() { alert('hello'); }; } } 我被告知应该使用prototype来添加方法,因为它只需要为对象的所有实例创建一次。问题是,我似乎需要在定义构造函数后添加原型方法,如下所示 var someObject = { someClass: fun
var someObject = {
someClass: function() {
this.someMethod = function() {
alert('hello');
};
}
}
我被告知应该使用prototype来添加方法,因为它只需要为对象的所有实例创建一次。问题是,我似乎需要在定义构造函数后添加原型方法,如下所示
var someObject = {
someClass: function() {
}
}
someObject.someClass.prototype.someMethod = function() {
alert('hello');
};
var someObject = {
someClass: function() {
this.prototype.someMethod = function() {
alert('hello');
};
}
}
理想情况下,我希望在构造函数中定义原型方法,如下所示
var someObject = {
someClass: function() {
}
}
someObject.someClass.prototype.someMethod = function() {
alert('hello');
};
var someObject = {
someClass: function() {
this.prototype.someMethod = function() {
alert('hello');
};
}
}
但是,这会导致一个错误,指出原型为null或不是对象。是否有一种方法可以实现我想要的,或者这是不可能的?是的,您不能在类的构造函数中访问prototype属性,但您可以使用稍微不同的代码表示法,因此它可能对您有所帮助:
var someObject = {
someClass: (function wrapper() {
var ctor = function(){};
ctor.prototype.someMethod = function(){
alert('hello');
};
return ctor;
})()
}
您可以使用
参数.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;
});
有关使用对象文字和包装器函数的等效解决方案,请参阅,这可能更为熟悉。Prototype并不是这样工作的。@IAbstractDownvoteFactory您能详细说明一下吗?当然会出现错误,因为“this”表示该对象的实例,而不是“definition”该对象或其属性或方法的属性。@Birey
this
表示调用函数时创建的对象,如var object=new someObject.someClass()代码>我现在明白了。它来自不同的语言背景,一开始并没有点击。这么简单,现在我想起来了。原型只被调用一次的原因是它在构造函数之外。我喜欢将原始对象转换为匿名构造函数的想法,这样我就可以在那里放置原型方法,而不是在初始对象定义之后。