使用技巧在javascript中强制执行私有继承
Using tricks to enforce private inheritance in javascript
所以我想出了一些技巧来检查并查看是否从对象内部调用了函数。有人能给我一些不做这种事的好理由吗?
function Poo(){
this.myFunc=function(){
for(x in this)
{
if (this.myFunc.caller==this[x]) {
alert(this.myFunc.caller==this[x]);
return;}
}
alert(false);
}
this.myFunc2=function(){this.myFunc();}
}
var mine=new Poo();
mine.myFunc(); //calling directly not allowed prints false
mine.myFunc2(); //called from a member function allowed prints true
你可以做任何你想做的事情,但是,我可以向你展示一个你的方法不起作用的例子:
function Poo(){
this.myFunc = function () {
for(x in this) {
if (this.myFunc.caller == this[x]) {
console.info('internal call, accepted');
return;
}
}
console.error('no external calls allowed');
};
this.myFunc3 = function () {
var self = this;
// this is a standard way of
// passing functions to callbacks
// (eg, ajax callbacks)
this.myFunc4(function() {
self.myFunc();
});
}
this.myFunc4 = function (callback) {
// do stuff...
callback();
};
}
var mine = new Poo();
mine.myFunc3();
myFunc3在对象中,所以我认为您会期望在它给myFunc4(也在对象中)的回调中调用myFunc。然而,调用者不能很好地处理匿名函数。
此外,在比较函数的同时迭代整个实例方法和属性绝对不是"面向对象"的方法。由于您试图模拟private
方法,我假设OO就是您想要的。
您的方法没有利用JS提供的任何功能,只是以一种不雅的方式(重新)构建了现有的功能。虽然出于学习目的,这可能很有趣,但我不建议在发布生产代码时使用这种心态。
stackover上还有另一个问题,它有一个你可能感兴趣的答案:为什么arguments.callee.caller属性在JavaScript中被弃用?
edit:我如何从回调中调用myFunc的小更改,在匿名函数this
中不是实例。
我不能给你一个不这样做的好理由,但有一个更简单的解决方案。
function Poo() {
var myFunc = function() {
alert('myfunc');
};
this.myFunc2 = function() {
myFunc();
}
}
var mine = new Poo();
var mine.myFunc(); // Won't work
var mine.myFunc2(); // Will work
为什么不使用类似模块模式的东西来隐藏"私有"方法的实现呢。
var poo = function(){
var my = {},
that = {};
my.poo = function() {
// stuff
};
that.foo = function(){
my.poo(); //works
// more stuff
};
return that;
};
poo.foo(); // works
poo.poo(); // error
相关文章:
- 使用技巧在javascript中强制执行私有继承
- Javascript RegEx-强制执行两个最大长度
- 在 gruntjs 构建失败的情况下强制执行某些任务
- 在ExtJs 4网格中强制执行唯一键值
- 强制执行本地托管Web应用程序的许可证
- 如何在JavaScript中强制执行单线程行为
- 对文本框强制执行大小写约束
- 用于强制执行 JSON 结构的 Javascript 类
- JSHINT:有没有办法忽略仅驼峰大小写属性并将其强制执行到变量和函数上
- 如何使用 JavaScript 在输入后强制执行函数
- 唯一字段约束在 dropDatabase 之后未强制执行
- 有没有办法检查是否强制执行严格模式
- 如何对 Flux 存储中的状态变量强制执行隐私
- 在部分回发后强制执行 JavaScript(更新面板)
- 在Razor生成的隐藏字段上强制执行类型,在没有强制转换的JavaScript中接收变量
- 有没有zxcvbn.js的PHP版本,或者我可以在服务器端使用它来强制执行密码规则
- 在不实际更改DOM元素的情况下对其强制执行更改事件
- 如何强制执行以前注入的脚本
- 如何使用我的javascript强制执行正确的顺序
- 如何在redux中强制执行数据约束