是否有类似Object.defineProperty的方法来定义变量
Is there an analogue to Object.defineProperty to define variables?
很容易通过导出模块的公共方法访问私有变量:
var makeAModule = function() {
var _secret = 'Ssh!';
var module = {
tellMeYourSecret: function() {
console.log(_secret);
}
};
return module;
}
// > var m = makeAModule();
// > m.tellMeYourSecret();
// Ssh!
有时我需要使用Object.defineProperty定义属性,这些属性是由getter使用其他私有变量的值计算的。不过,这些东西必须放在一个物体上,所以我最终制作了一个私人物体来装它们。如果我不把我所有的私人成员都存储在那个物体上,就会很难记住上面有哪些道具,没有,所以我把所有东西都放在那里:
var makeAModule = function() {
var priv = {};
priv._secret = 'Ssh!';
Object.defineProperty(priv, 'secretLength', {
get: function() {
return priv._secret.length;
}
});
var module = {
tellMeYourSecret: function() {
console.log(priv._secret);
},
howLongIsYourSecret: function() {
console.log(priv._secretLength);
}
}
return module;
}
// > var m = makeAModule();
// > m.howLongIsYourSecret();
// 4
有没有办法定义一个变量(不附加到对象),它的值是通过getter计算的?类似这样的东西:
var makeAModule = function() {
var _secret = 'Ssh!';
Object.defineVariable('_secretLength', {
get: function() {
return _secret.length;
}
})
var module = {
tellMeYourSecret: function() {
console.log(_secret);
},
howLongIsYourSecret: function() {
console.log(_secretLength);
}
}
return module;
}
不直接。
但是,您可以将其设置为window
的属性,从而使其成为全局变量。但是使用全局变量是不推荐的,特别是如果它们是秘密的。
var makeAModule = function() {
var priv = {};
priv._secret = 'Ssh!';
Object.defineProperty(window, '_secretLength', {
get: function() {
return priv._secret.length;
}
});
return {
tellMeYourSecret: function() {
return _secret;
},
howLongIsYourSecret: function() {
return _secretLength;
}
};
};
document.body.innerHTML =
"Secret length: " + makeAModule().howLongIsYourSecret();
或者,您可以将getter定义为对象的属性,并使用with
语句。请注意,with
语句不能在严格模式下使用。
var makeAModule = function() {
var priv = {};
priv._secret = 'Ssh!';
Object.defineProperty(priv, '_secretLength', {
get: function() {
return priv._secret.length;
}
});
with(priv) {
return {
tellMeYourSecret: function() {
return _secret;
},
howLongIsYourSecret: function() {
return _secretLength;
}
};
}
};
document.body.innerHTML =
"Secret length: " + makeAModule().howLongIsYourSecret();
相关文章:
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 用于检查数组中是否存在元素的javascript自定义方法
- Meteor-添加用户自定义字段的方法不起作用
- 骨干's Router.execute(callback,args,name)方法获取未定义的名称
- 在angularjs中创建自定义控件的推荐方法
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- React路由器错误-'无法调用方法'getRouteAtDepth'的未定义'
- 去掉多余的方法定义
- Javascript方法定义失败
- 属性定义是使用敲除时的方法定义
- Javascript:使用eclipse跳转到方法定义
- 使用以下两种方法定义的方法之间的差异
- 为什么函数属性定义在对象本身上(例如Function.name),而方法定义在Function.prototype上?
- ES6箭头函数和方法定义的区别
- 如果没有“函数”,这个对象方法定义如何工作?关键字
- 使用DOM方法定义文本框的动态宽度
- Javascript方法定义不一致
- 为什么实例方法定义在原型中,而实例字段定义在构造函数中?
- Reactjs最好的策略是为渲染方法定义一个变量
- 在JavaScript中:类中函数和方法定义之间的语法差异