开发者

Why cant I declare a constructor instantiate an object and then access the prototype?

开发者 https://www.devze.com 2023-03-07 12:15 出处:网络
The below doesnt work and im struggling to work out why.... function CommentHandler() { var Text; } var myCommentHandler = new CommentHandler();

The below doesnt work and im struggling to work out why....

function CommentHandler() {

    var Text;
}


var myCommentHandler = new CommentHandler();

myCommentHandler.开发者_如何学Goprototype.SayHello = function () {

    document.write('Hello World');

}

I get the error : 'myCommentHandler.prototype is undefined'

I just cant see why? I have declared a variable called myCommentHandler and copied in the object CommentHandler then Im trying to access the protoype of it and assign a function but I cant...Anyone know why?


The prototype belongs to the class, not the instance:

CommentHandler.prototype.MyFunction = ...

However you can also access the prototype via the instance's constructor property:

myObj.constructor.prototype.MyFunction = ...

This will of course add that function to every instance of your CommentHandler.

If instead you only wanted to add that function to that one instance, you'd do:

myObj.MyFunction = ...

Note that in none of these variants would it be possible for MyFunction to access your private variable Text.

This is the compromise forced by the prototype inheritance model - variables and methods must be public (e.g. this.Text) if they're to be accessed from outside, and in this case functions declared in the prototype are effectively "outside".

The alternative (using closure-scoped variables and methods) seems more natural to OO programmers, but makes inheritance much harder.


I think what you actually want here is this:

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


You have to use

CommentHandler.prototype.SayHello = function(){....}

You can find more about the prototype object in the following references
http://www.javascriptkit.com/javatutors/proto.shtml
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/prototype
http://msdn.microsoft.com/en-us/magazine/cc163419.aspx


You need to prototype the class function rather than the instance. Also if you want the Text variable to be accessible outside the constructor, in the other method functions, then you need to add the this keyword.

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

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

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

As a side point you could create the SayHello function inside the constructor, but this would add increased overhead to the creation of each instance of CommentHandler. Thus the prototyping method that you are using is a better option.


myCommentHandler does not have a prototype, because it is an instance. CommentHandler does have a prototype that can be modified. I am guessing you want to edit the object after initializing, and can do so like this:

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

Here is a good explanation of prototypes and object oriented programming in javascript with many examples: http://mckoss.com/jscript/object.htm

0

精彩评论

暂无评论...
验证码 换一张
取 消