以下不起作用,我正在努力找出原因......
function CommentHandler() {
var Text;
}
var myCommentHandler = new CommentHandler();
myCommentHandler.prototype.SayHello = function () {
document.write('Hello World');
}
我收到错误:'myCommentHandler.prototype is undefined'
我不明白为什么?我已经声明了一个名为myCommentHandler的变量并在对象CommentHandler中复制然后我试图访问它的原型并分配一个函数,但我不能......任何人都知道为什么?
答案 0 :(得分:4)
原型属于类,而不属于实例:
CommentHandler.prototype.MyFunction = ...
但是,您也可以通过实例的constructor
属性访问原型:
myObj.constructor.prototype.MyFunction = ...
这当然会将该函数添加到您的CommentHandler的每个实例。
如果您只想将该功能添加到该一个实例,您可以这样做:
myObj.MyFunction = ...
请注意,在MyFunction
访问私有变量Text
时,这些变体都不可用。
这是原型继承模型所强加的折衷 - 如果要从外部访问它们,变量和方法必须是公共的(例如this.Text
),在这种情况下,原型中声明的函数是有效的“外”。
替代方案(使用闭包范围的变量和方法)对于OO程序员来说似乎更自然,但是使继承变得更加困难。
答案 1 :(得分:0)
我认为你真正想要的是这个:
CommentHandler.prototype.SayHello = function () {
document.write('Hello World');
};
答案 2 :(得分:0)
你必须使用
CommentHandler.prototype.SayHello = function(){....}
您可以在以下参考文献中找到有关原型对象的更多信息
http://www.javascriptkit.com/javatutors/proto.shtml {
{3}} {
{3}}
答案 3 :(得分:0)
您需要对类函数进行原型而不是实例。此外,如果您希望Text
变量可以在构造函数外部访问,那么在其他方法函数中,您需要添加this
关键字。
function CommentHandler() {
this.Text = 'Hello World';
}
CommentHandler.prototype.SayHello = function () {
document.write(this.Text);
}
var myCommentHandler = new CommentHandler();
myCommentHandler.SayHello();
作为一个侧面点,您可以在构造函数中创建SayHello
函数,但这会增加CommentHandler
每个实例创建的开销。因此,您使用的原型设计方法是更好的选择。
答案 4 :(得分:0)
myCommentHandler
没有有原型,因为它是一个实例。 CommentHandler
有一个可以修改的原型。我猜你想在初始化之后编辑对象,并且可以这样做:
myCommentHandler.SayHello = function() {
document.write('Hello World');
}
以下是javascript中原型和面向对象编程的一个很好的解释,有很多例子:http://mckoss.com/jscript/object.htm