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

Javascript 为什么我不能声明一个构造函数实例化一个对象,然后访问原型?,javascript,Javascript,下面的内容不起作用,我正在努力找出原因 function CommentHandler() { var Text; } var myCommentHandler = new CommentHandler(); myCommentHandler.prototype.SayHello = function () { document.write('Hello World'); } 我得到错误:“myCommentHandler.prototype未定义” 我就是不明白为

下面的内容不起作用,我正在努力找出原因

function CommentHandler() {

    var Text;
}


var myCommentHandler = new CommentHandler();

myCommentHandler.prototype.SayHello = function () {

    document.write('Hello World');

}
我得到错误:“myCommentHandler.prototype未定义”


我就是不明白为什么?我已经声明了一个名为myCommentHandler的变量,并复制到对象CommentHandler中,然后我试图访问它的原型并分配一个函数,但我无法…有人知道为什么吗?

我想你真正想要的是:

CommentHandler.prototype.SayHello = function () {
    document.write('Hello World');
};

我想你真正想要的是:

CommentHandler.prototype.SayHello = function () {
    document.write('Hello World');
};
你必须使用

CommentHandler.prototype.SayHello = function(){....}
您可以在以下参考资料中找到有关prototype对象的更多信息


您必须使用

CommentHandler.prototype.SayHello = function(){....}
您可以在以下参考资料中找到有关prototype对象的更多信息



您需要原型化类函数,而不是实例。另外,如果您希望在构造函数之外的其他方法函数中访问
文本
变量,则需要添加
this
关键字

function CommentHandler() {
    this.Text = 'Hello World';
}

CommentHandler.prototype.SayHello = function () {
    document.write(this.Text);
}

var myCommentHandler = new CommentHandler();
myCommentHandler.SayHello();

作为补充,您可以在构造函数中创建
SayHello
函数,但这会增加
CommentHandler
每个实例的创建开销。因此,您使用的原型化方法是一个更好的选择。

您需要原型化类函数,而不是实例。另外,如果您希望在构造函数之外的其他方法函数中访问
文本
变量,则需要添加
this
关键字

function CommentHandler() {
    this.Text = 'Hello World';
}

CommentHandler.prototype.SayHello = function () {
    document.write(this.Text);
}

var myCommentHandler = new CommentHandler();
myCommentHandler.SayHello();

作为补充,您可以在构造函数中创建
SayHello
函数,但这会增加
CommentHandler
每个实例的创建开销。因此,您使用的原型方法是一个更好的选择。

原型属于类,而不是实例:

但是,您也可以通过实例的
构造函数
属性访问原型:

myObj.constructor.prototype.MyFunction = ...
这当然会将该函数添加到CommentHandler的每个实例中

如果您只想将该函数添加到该实例中,您可以执行以下操作:

myObj.MyFunction = ...
请注意,在所有这些变量中,
MyFunction
都不可能访问您的私有变量
Text

这是原型继承模型强制的妥协——如果要从外部访问变量和方法(例如,
This.Text
),那么它们必须是公共的,在这种情况下,原型中声明的函数实际上是“外部的”


对于OO程序员来说,另一种选择(使用闭包范围的变量和方法)似乎更自然,但会使继承更加困难。

原型属于类,而不是实例:

但是,您也可以通过实例的
构造函数
属性访问原型:

myObj.constructor.prototype.MyFunction = ...
这当然会将该函数添加到CommentHandler的每个实例中

如果您只想将该函数添加到该实例中,您可以执行以下操作:

myObj.MyFunction = ...
请注意,在所有这些变量中,
MyFunction
都不可能访问您的私有变量
Text

这是原型继承模型强制的妥协——如果要从外部访问变量和方法(例如,
This.Text
),那么它们必须是公共的,在这种情况下,原型中声明的函数实际上是“外部的”


另一种选择(使用闭包范围的变量和方法)对OO程序员来说似乎更自然,但会使继承更加困难。

myCommentHandler没有原型,因为它是一个实例
CommentHandler
确实有一个可以修改的原型。我猜您想在初始化后编辑对象,可以这样做:

myCommentHandler.SayHello = function() {
    document.write('Hello World');
}

这里有很多例子可以很好地解释javascript中的原型和面向对象编程:

myCommentHandler
没有原型,因为它是一个实例
CommentHandler
确实有一个可以修改的原型。我猜您想在初始化后编辑对象,可以这样做:

myCommentHandler.SayHello = function() {
    document.write('Hello World');
}

这里有很多例子可以很好地解释javascript中的原型和面向对象编程:

原型函数无法访问原始闭包中的变量(或私有方法)-如果实例数量很少,有时最好使用嵌套函数。我不太清楚您的意思。上面示例中的this.Text可以在原型函数中完全访问。至于嵌套函数,如果有多个实例,它就没有原型化那么有效。我认为在我写注释时,代码不在那里。是的,
this.Text
是可访问的,但是
var Text
不会。原型函数无法访问原始闭包中的变量(或私有方法)-如果实例数量很少,有时最好使用嵌套函数。我不太清楚您的意思。上面示例中的this.Text可以在原型函数中完全访问。至于嵌套函数,如果有多个实例,它就没有原型化那么有效。我认为在我写注释时,代码不在那里。是的,
this.Text
可以访问,但是
var Text
不能访问。