为什么我不能声明构造函数实例化一个对象,然后访问原型?

时间:2011-05-20 11:04:13

标签: javascript

以下不起作用,我正在努力找出原因......

function CommentHandler() {

    var Text;
}


var myCommentHandler = new CommentHandler();

myCommentHandler.prototype.SayHello = function () {

    document.write('Hello World');

}

我收到错误:'myCommentHandler.prototype is undefined'

我不明白为什么?我已经声明了一个名为myCommentHandler的变量并在对象CommentHandler中复制然后我试图访问它的原型并分配一个函数,但我不能......任何人都知道为什么?

5 个答案:

答案 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