当前位置: 首页 > 面试题库 >

从原型定义的函数访问私有成员变量

翁硕
2023-03-14
问题内容

有什么方法可以使“私有”变量(在构造函数中定义的变量)可供原型定义的方法使用?

TestClass = function(){
    var privateField = "hello";
    this.nonProtoHello = function(){alert(privateField)};
};
TestClass.prototype.prototypeHello = function(){alert(privateField)};

这有效:

t.nonProtoHello()

但这不是:

t.prototypeHello()

我习惯于在构造函数中定义方法,但出于以下两个原因而逐渐远离它。


问题答案:

不,没有办法。这基本上是相反的范围。

在构造函数内部定义的方法可以访问私有变量,因为所有函数都可以访问定义它们的作用域。

在原型上定义的方法未在构造函数的范围内定义,并且将无法访问构造函数的局部变量。

您仍然可以拥有私有变量,但是如果希望在原型上定义的方法可以访问它们,则应该在this对象上定义getter和setter ,原型方法(以及其他所有方法)
可以访问它们。例如:

function Person(name, secret) {
    // public
    this.name = name;

    // private
    var secret = secret;

    // public methods have access to private members
    this.setSecret = function(s) {
        secret = s;
    }

    this.getSecret = function() {
        return secret;
    }
}

// Must use getters/setters 
Person.prototype.spillSecret = function() { alert(this.getSecret()); };


 类似资料:
  • 注意:如果friend函数只是在类中声明并在外部实现,那么Clang和GCC都会拒绝该代码。

  • 问题内容: 是在类级别还是在对象级别的私有成员访问权限。如果是在对象级别,则以下代码不应编译 请说明在sub的messWithI()方法中访问obj的成员i是否有效 问题答案: 正如DevSolar所说的,它处于(顶级)类级别。 从Java语言规范的6.6节开始: 否则,如果将成员或构造函数声明为私有,则仅当访问发生在包含成员或构造函数的声明的顶级类(第7.6节)的主体内时,才允许访问。 请注意,

  • 最近在review代码的时候发现,使用了空指针调用成员函数,并且成员函数内部有使用到成员变量,居然没有出错。很是奇怪,就用一篇博客把关于空指针调用成员函数相关的内容总结起来。 空指针调用成员函数 调用普通成员函数 如果空指针调用普通成员函数,看该函数体中是否使用到了this指针(是否访问非静态成员变量)。如果使用到了this指针,程序会崩溃;如果没有使用到this指针,程序不会崩溃。当然,如果访问

  • 问题内容: 如您所知,Spring可以将值注入私有实例变量,而Hibernate可以访问持久类的私有变量。但是,我什至不能通过反射来调用类的受保护方法!Spring和Hibernate如何公然破坏安全性?更重要的是,我该怎么做?:D 问题答案: 在没有禁止性安全管理器的情况下运行时,可以获取相应方法或字段低谷反射的实例,然后在其上调用setAccessible()。 使用Java安全管理器,您当然

  • 我创建了Angular2 Typescript项目。我有很多表格,所以我想有一个类似基本组件的东西。 这是我的基本组件: 现在有我的子组件。我想从http获取所有项目,然后将其分配给基类 知道如何从订阅方法访问基字段吗?

  • 我知道我们可以通过反射访问私有构造函数,就像@Sanjay T.Sharma在回答我的问题时提到的:“instanceof void”总是返回false吗? 不过,@Duffymo表示: 您可以使用反射访问私有的所有东西--方法、构造函数、数据成员、所有东西。 如何访问私有方法和私有数据成员? 是否可以通过反射访问局部变量? 是否有方法防止任何人访问私有构造函数、方法和数据成员?