在javascript中访问私有函数的方法?

时间:2017-01-25 18:03:51

标签: javascript

我有一个简单的 js 功能

var myFunction=function(){
    var age=20;
    this.name="bar";
    var show=function(){
        console.log(age);
    }
}

并创建实例,例如:

 var obj=new myFunction();
 console.log(obj.show())

日志: this

怎么能我解决它?我试图搜索SO但是找不到我的解决方案。 的更新 我希望所有私人成员保持不变。

4 个答案:

答案 0 :(得分:3)

您的代码存在的问题是,在show的函数范围之外无法访问myFunction方法。

在Javascript中,范围是在函数中定义的(忽略ES6块范围)。因此,变量[{1}},agename的范围在函数内。但是,当您使用show并使用构造函数(this)时,新创建的对象包含与new关键字关联的属性。在您的情况下,您只将this属性与新对象相关联,并且未将name函数与show相关联。

其中一个解决方案是使用模块模式。您可以通过返回封装公开公开属性的Object来创建公共可访问属性。因此,在您的情况下,您可以从this公开nameshow方法。此外,无需两次执行console.log。您可以按myFunction获取输出。否则,它将记录obj.show(),因为undefined函数不会返回任何内容。



show




答案 1 :(得分:0)

尝试将代码更改为

var myFunction=function(){
var age=20;
this.name="bar";
this.show=function(){
console.log(age);
}
}

将show var更改为属性

答案 2 :(得分:0)

一个干净的解决方案是将该函数作为对象属性公开访问:



your_object = SetNullStringToDefault<EntityType>(your_object, "Default Value");
&#13;
&#13;
&#13;

答案 3 :(得分:0)

使用var,您将public class NotificationHub : Hub { private IHttpContextAccessor _contextAccessor; private HttpContext _context { get { return _contextAccessor.HttpContext; } } public NotificationHub(IHttpContextAccessor contextAccessor) { _contextAccessor = contextAccessor; } public async Task JoinGroup() { Groups.Add(Context.ConnectionId, $"notification_{_context.User.Identity.Name}"); } public void Send(JsonResult notification) { Clients.Client(Context.ConnectionId).sendNotification(notification); } } 声明为变量,而不是show的成员。 与myFunction相同,如果是类成员,则还应使用age

这是改变它的一种方式:

&#13;
&#13;
this
&#13;
&#13;
&#13; 在此处查找更多信息:best approach to member variables in object-oriented javascript?