有没有办法使"私有"变量(那些在构造函数中定义的)可用于原型定义的方法?

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

这是可行的:

t.nonProtoHello()

但这不会:

t.prototypeHello()

我习惯于在构造函数中定义我的方法,但出于几个原因,我正在远离它.

推荐答案

不,没有办法.这实质上是反向的范围界定.

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

原型上定义的方法不在构造函数的作用域内定义,并且不能访问构造函数的局部变量.

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

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

Javascript相关问答推荐

如果被1个Phaser JS抵消,我的倾斜碰撞

HTML/JavaScript函数未执行

鼠标移动时更新画布

我的YouTube视频没有以html形式显示,以获取免费加密信号

根据总价格对航班优惠数组进行排序并检索前五个结果- Angular HTTP请求

如何为GrapesJS模板编辑器创建自定义撤销/重复按钮?

togglePopover()不打开但不关闭原生HTML popover'

点击按钮一次有文本出现和褪色,而不是点击两次?(html,CSS,JavaScript)

Angular material 拖放堆叠的牌副,悬停时自动展开&

如何将Map字符串,布尔值转换为{key:string;value:bo布尔值;}[]?<>

Mongoose post hook在使用await保存时不返回Postman响应

如何使用子字符串在数组中搜索重复项

将核心模块导入另一个组件模块时存在多个主题

Puppeteer上每页的useProxy返回的不是函数/构造函数

无法重定向到Next.js中的动态URL

WebSocketException:远程方在未完成关闭握手的情况下关闭了WebSocket连接.&#三十九岁;

使用Reaction窗体挂钩注册日历组件

postman 预请求中的hmac/sha256内标识-从js示例转换

JavaScript -复制到剪贴板在Windows计算机上无效

从异步操作返回对象