我在遗留应用中找到了类似的代码:
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方法未定义。原型等于定义其他函数的函数。 。 。希望我只是在这里忽略一些简单的东西。
如何访问此原型函数?
谢谢。
答案 0 :(得分:3)
如果您在更改原始代码时没有任何问题,可以执行以下操作,让原型使用IIFE接收对象:
Example.prototype = (function () {
return {
showAlert : function (message) {
alert(message);
}
}
})();
var example = new Example(null, null, null);
example.showAlert("hello");
答案 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
我无法想象这就是你的意图,所以我的建议是坚持扩展原型(但即使只是你必须这样做)。