首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在javascript中使用技巧强制私有继承

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

Stack Overflow用户
提问于 2012-09-05 23:16:13
回答 3查看 117关注 0票数 0

因此,我想出了一些类似黑客的方法来检查和查看是否从对象本身内部调用了函数。有没有人能给我一些好的理由让我不要做这样的事情?

代码语言: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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-05 23:37:42

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

代码语言:javascript
复制
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的调用能够工作。然而,caller在处理匿名函数时做得并不好。

此外,在比较函数的同时遍历整个实例方法和属性肯定不是“面向对象”的方式。由于您正在尝试模拟private方法,因此我假设OO就是您要寻找的对象。

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

还有另一个关于堆叠的问题,它有一个您可能感兴趣的答案:Why was the arguments.callee.caller property deprecated in JavaScript?

编辑:在匿名函数this不是实例的情况下,对我从回调中调用myFunc的方式做了一些小的改变。

票数 1
EN

Stack Overflow用户

发布于 2012-09-05 23:23:48

我不能给你一个好的理由不这样做,但更容易的解决方案。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2012-09-05 23:24:24

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12284614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档