如何访问原型函数?

时间:2015-03-09 16:04:51

标签: 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 example = new Example(null, null, null);

所以我试图像这样访问原型方法:

    example.showAlert("hello");

这是jsfiddle:http://jsfiddle.net/64dkjke1/

它不起作用。 。 。 showAlert方法未定义。原型等于定义其他函数的函数。 。 。希望我只是在这里忽略一些简单的东西。

如何访问此原型函数?

谢谢。

4 个答案:

答案 0 :(得分:3)

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

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

var example = new Example(null, null, null);

example.showAlert("hello");

Fiddle

答案 1 :(得分:1)

是不是这样,将一个物体附加到原型上?很难确定问题是什么,因为您说您发布的代码与传统应用中的代码只有类似,因此我们无法真正做到知道肯定。

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

答案 2 :(得分:1)

你不能,导致

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);

答案 3 :(得分:1)

您无法访问showAlert()功能(正如您已经想到的那样)
原因很简单。

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);
    }
};

有人可能会说这个新功能不能很好地用作原型,但仍然可以 IS 可调用(回到原来的问题)。你可以这样称呼它:

 Example.prototype()

但是没有任何事情会发生,因为这个功能中唯一发生的事情就是它会声明一个私人的'这个原型范围内的函数,永远不会被调用。

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

我无法想象这就是你的意图,所以我的建议是坚持扩展原型(但即使只是你必须这样做)。