使用.call/.apply来隐藏类方法

5
有人能解释一下这段来自单页应用深入的摘录是什么意思吗?
引用如下: 常见的类模式(例如从原型实例化的对象)是通过在方法名前加下划线将类方法标记为私有方法。你可以使用.call/.apply设置“this”来正确隐藏类方法,但我不会在这里展示它;这是一个细节。
我认为它建议有一种方法可以使JavaScript中的'private'方法真正无法访问,而不是仅仅用下划线标记它们的约定,但我无法想象实现的样子,也不知道它将如何使用。

+1 链接到单页应用电子书!谢谢。 - Renato Gama
2个回答

3
var Treasure = function(){  
  function locate(){
    return this.x * this.y + 31337;
  }

  function Treasure(x, y){
    this.x = x;
    this.y = y;
  }

  Treasure.prototype.find = function find(){
    return locate.call(this);
  };

  return Treasure;
}();

locate是构造函数和原型方法的共享私有函数。使用call,它可以像方法一样运行并利用this

这个概念的更完整实现是接口对象和实现对象。不是像上面的随机函数一样作为方法(类似于locate),而是创建一个完整的私有类。每个接口的外部创建都会产生两个对象:公共外壳接口和私有实现对象。这使您能够公开提供一个提供不同、可能更易于使用的API的接口。或者可以允许您为整个接口对象组重用单个私有实现对象。

这实际上是DOM规范的工作方式(通常不在js中实现)。接口对象(例如元素和节点对象)专门要求包装实际执行单词的底层实现。暴露的对象只是转发属性访问和方法调用的外壳。

Dom.js是一个完整的DOM实现,是用js制作的。我在其中了解到的一个有趣的技术是完全自动化生成公共接口。这就是IDL的目的:公共API实际上是自动生成的,只留下私有实现需要被创建。这实际上意味着可以创建这样的东西而不需要咨询人类:https://github.com/Benvie/svgstuff/blob/master/lib/defs.js


1

在这个例子中,您可以看到两种类型的变量。您会注意到第一个是私有的,第二个是公开可访问的:

function x() {
    var _var1 = "hello";
    this.var2 = "world";
    x.prototype.innerTest = function() {
        console.log("inner var1: " + _var1);
        console.log("inner var2: " + this.var2);
    }
}

var y = new x;
console.log("var1: " + y._var1);
console.log("var2: " + y.var2);

// var1: undefined
// var2: world

运行内部测试表明var1可以从类内部访问:

y.innerTest();
// var1: hello
// var2: world

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接