Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用技巧在javascript中强制私有继承_Javascript_Oop_Coding Style - Fatal编程技术网

使用技巧在javascript中强制私有继承

使用技巧在javascript中强制私有继承,javascript,oop,coding-style,Javascript,Oop,Coding Style,所以我想出了一个类似黑客的方法来检查函数是否是从对象本身内部调用的。有人能给我一些不做这种事的好理由吗 function Poo(){ this.myFunc=function(){ for(x in this) { if (this.myFunc.caller==this[x]) { alert(this.myFunc.caller==this[x]); return;} }

所以我想出了一个类似黑客的方法来检查函数是否是从对象本身内部调用的。有人能给我一些不做这种事的好理由吗

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() {
     var myFunc = function() {
          alert('myfunc');
     };

     this.myFunc2 = function() {
         myFunc();
     }
}

var mine = new Poo();
var mine.myFunc();  // Won't work
var mine.myFunc2(); // Will work

为什么不使用模块模式之类的东西来隐藏“私有”方法的实现呢


你可以做任何你想做的事,但是,我可以给你展示一个你的方法不起作用的例子:

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会起作用。然而,调用方不能很好地处理匿名函数

此外,在比较函数时迭代整个实例方法和属性绝对不是“面向对象”的方法。由于您试图模拟
私有
方法,所以我假设OO就是您所寻找的

您的方法没有利用JS提供的任何功能,您只是以一种不雅观的方式(重新)构建现有功能。虽然出于学习目的,这可能很有趣,但我不建议在发布生产代码时使用这种心态

关于stackover还有一个问题,您可能会感兴趣:


编辑:在匿名函数
中,我如何从回调函数调用myFunc有一个小小的改变,这个
不是实例。

有理由这样做吗?我的意思是,如果有人调用他不应该调用的函数,他也可以编辑您的验证away@Wurstbro我知道有很多方法可以解决这个问题,它的要点是提供一个更有力的提示,表明类的使用方式比以underscore@Tim如果您已经提供了良好的api文档和用例,那么您不应该关心该类是否被错误地使用。我觉得这种把戏没用。如果他真的想在规范之外使用这个类,不管你怎么做,他都会这么做。我不一定理解否决票。我不是建议你真的这么做。在我看来,Javascript的对象模型对数据隐藏没有很好的支持,而且90%的Javascript编程似乎都在输入冗长的习惯用法。结果:沮丧。我实际上知道这种方法。据我所知,这个解决方案不处理某些类型的作用域。还是我错了?你能举一个例子说明什么类型的作用域问题可以解决这个问题吗?据我所知,私有成员无法从构造函数外部添加到原型的函数中访问。只要人们使用
new
,否则
这个
将成为
全局对象
,并且然后你可以调用
myFunc
,但这是假设
这个
可以是全局的而不会导致错误。我的意思是,就像这个堆栈交换帖子中的第三个代码块:由于javascript的词法范围规则,“private\u member”不会在成员“public\u method”中定义,这就是我想要的答案。
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();