Javascript 如何访问原型功能?

Javascript 如何访问原型功能?,javascript,Javascript,我在一个旧版应用程序中发现了类似的代码: var Example = function (var1, var2, var3) { this.prop1 = var1; this.prop2 = var2; this.prop3 = var3 }; Example.prototype = function () { var showAlert = function (message) { alert(message); } }; var exampl

我在一个旧版应用程序中发现了类似的代码:

var Example = function (var1, var2, var3) {
   this.prop1 = var1;
   this.prop2 = var2;
   this.prop3 = var3
};

Example.prototype = function () {
   var showAlert = function (message) {
       alert(message);
   }
};

var example = new Example(null, null, null);
所以我试着像这样访问原型方法:

    example.showAlert("hello");
 Example.prototype()
以下是JSFIDLE:

它不起作用。showAlert方法未定义。原型相当于一个函数,该函数定义了内部的其他函数。希望我只是忽略了一些简单的事情

如何访问此原型功能


谢谢。

是这样的,将一个对象附加到原型上吗?很难确定问题出在哪里,因为你说你发布的代码只与旧版应用程序中的代码相似,所以我们无法确定

Example.prototype = {
  showAlert: function (message) {
    alert(message);
  }
}

而是这样,将一个对象附加到原型上?很难确定问题出在哪里,因为你说你发布的代码只与旧版应用程序中的代码相似,所以我们无法确定

Example.prototype = {
  showAlert: function (message) {
    alert(message);
  }
}
你不能,因为

var showAlert = function (message) {
     alert(message);
 }
这是私人的

您可以这样做:

function abc(){
 var myPrivateVar = "Hello";
  this.alert = function(){
    alert(myPrivateVar);
  }
}
new abc().alert();
但不是这个

var a = new abc();
alert(a.myPrivateVar);
你不能,因为

var showAlert = function (message) {
     alert(message);
 }
这是私人的

您可以这样做:

function abc(){
 var myPrivateVar = "Hello";
  this.alert = function(){
    alert(myPrivateVar);
  }
}
new abc().alert();
但不是这个

var a = new abc();
alert(a.myPrivateVar);

如果更改原始代码没有问题,可以执行以下操作,使原型使用以下命令接收对象:


如果更改原始代码没有问题,可以执行以下操作,让原型使用接收对象:


您无法访问函数
showarter()
(如您所知)
原因很简单。

Example.prototype = function ()
不通过函数扩展原型,而是覆盖整个原型(除非您非常清楚自己在做什么,否则通常不想这样做)。在JavaScript中,类的原型本身就是一个函数。通过调用将返回原型对象的
myClass.prototype
,您可以访问原型

原型可以扩展(就像JavaScript中的其他对象一样)
快速示例:

Example.prototype.showAlert = function(message){ alert(message); };
现在你可以打电话:

Example.prototype.showAlert("Hi");
// or calling it from an instance of Example:
var myExample = new Example();
myExample.showAlert("Hi")
因此,您的小提琴所做的是用以下内容替换整个原型:

function () {
    var showAlert = function (message) {
        alert(message);
    }
};
有人可能会说,这个新函数不能很好地作为原型,但仍然可以调用(回到您最初的问题)。你可以这样称呼它:

    example.showAlert("hello");
 Example.prototype()
但是什么也不会发生,因为这个函数中唯一发生的事情就是它将在这个原型范围内声明一个“private”函数,而这个函数永远不会被调用

// start of prototype function
var showAlert = function (message) {
        alert(message);
    }
// end of prototype function

我无法想象这是您的意图,因此我的建议是坚持扩展原型(但即使是必须扩展原型)。

您无法访问函数
showarert()
(如您已经了解的)
原因很简单。

Example.prototype = function ()
不通过函数扩展原型,而是覆盖整个原型(除非您非常清楚自己在做什么,否则通常不想这样做)。在JavaScript中,类的原型本身就是一个函数。通过调用将返回原型对象的
myClass.prototype
,您可以访问原型

原型可以扩展(就像JavaScript中的其他对象一样)
快速示例:

Example.prototype.showAlert = function(message){ alert(message); };
现在你可以打电话:

Example.prototype.showAlert("Hi");
// or calling it from an instance of Example:
var myExample = new Example();
myExample.showAlert("Hi")
因此,您的小提琴所做的是用以下内容替换整个原型:

function () {
    var showAlert = function (message) {
        alert(message);
    }
};
有人可能会说,这个新函数不能很好地作为原型,但仍然可以调用(回到您最初的问题)。你可以这样称呼它:

    example.showAlert("hello");
 Example.prototype()
但是什么也不会发生,因为这个函数中唯一发生的事情就是它将在这个原型范围内声明一个“private”函数,而这个函数永远不会被调用

// start of prototype function
var showAlert = function (message) {
        alert(message);
    }
// end of prototype function

我无法想象这是您的意图,因此我的建议是坚持扩展原型(但即使是这样,也只有在必要的情况下)。

您确定分配给原型的函数不会返回对象并在实际代码中执行吗?我认为您在构建此示例时误解了您正在查看的代码。在当前状态下,在您分配给原型的函数之外无法访问
showart
。谢谢您。我毫不怀疑我误解了我所看到的。我想知道为什么我所尝试的不起作用,但我相信你用你的第二个评论回答了这个问题。谢谢你,我不明白为什么人们会否决这个。这个问题其实还不错,需要对原型的工作原理等有一定的了解。至少@CodeNewbie我能理解为什么会有否决票。为了压缩代码以发布它,我忽略了一些东西:
Example.prototype=function(){var showarter=function(message){alert(message);},Init=function(){//which get initialized};return{Init:Init};}
如果我看到这个,可能不会有职位。这里更新了JSFIDLE:(Sry,在理解这里的编辑功能时遇到了一些问题)您确定分配给原型的函数没有返回对象并在实际代码中执行吗?我认为您在构建此示例时误解了您正在查看的代码。在当前状态下,在您分配给原型的函数之外无法访问
showart
。谢谢您。我毫不怀疑我误解了我所看到的。我想知道为什么我所尝试的不起作用,但我相信你用你的第二个评论回答了这个问题。谢谢你,我不明白为什么人们会否决这个。这个问题其实还不错,需要对原型的工作原理等有一定的了解。至少@CodeNewbie我能理解为什么会有否决票。为了压缩代码以发布它,我忽略了一些东西:
Example.prototype=function(){var showarter=function(message){alert(message);},Init=functio