相关疑难解决方法(0)

JavaScript私有方法

要使用公共方法创建JavaScript类,我会执行以下操作:

function Restaurant() {}

Restaurant.prototype.buy_food = function(){
   // something here
}

Restaurant.prototype.use_restroom = function(){
   // something here
}
Run Code Online (Sandbox Code Playgroud)

这样我班级的用户可以:

var restaurant = new Restaurant();
restaurant.buy_food();
restaurant.use_restroom();
Run Code Online (Sandbox Code Playgroud)

如何创建一个可由buy_fooduse_restroom方法调用的私有方法,但不能由类的用户创建外部方法?

换句话说,我希望我的方法实现能够:

Restaurant.prototype.use_restroom = function() {
   this.private_stuff();
}
Run Code Online (Sandbox Code Playgroud)

但这不应该奏效:

var r = new Restaurant();
r.private_stuff();
Run Code Online (Sandbox Code Playgroud)

我如何定义private_stuff为私有方法,所以这两个都适用?

我已经阅读了Doug Crockford的几次写法,但看起来似乎不能通过公共方法调用"私有"方法,并且可以在外部调用"特权"方法.

javascript oop private-methods

454
推荐指数
12
解决办法
30万
查看次数

JavaScript ES6类中的私有属性

是否可以在ES6类中创建私有属性?

这是一个例子.我怎样才能阻止访问instance.property

class Something {
  constructor(){
    this.property = "test";
  }
}

var instance = new Something();
console.log(instance.property); //=> "test"
Run Code Online (Sandbox Code Playgroud)

javascript class private-members ecmascript-6 es2015

410
推荐指数
17
解决办法
22万
查看次数

为什么绑定比闭包慢?

之前的一张海报在Javascript中询问了Function.bind vs Closure:如何选择?

并且部分收到了这个答案,这似乎表明bind应该比闭包更快:

范围遍历意味着,当您要获取存在于不同范围内的值(变量,对象)时,会增加额外开销(代码执行速度变慢).

使用bind,您将调用具有现有范围的函数,因此不会进行范围遍历.

两个jsperfs表明bind实际上比闭包慢得多.

这是作为对上述评论发布的

并且,我决定编写自己的jsperf

那么为什么绑定这么慢(铬+ 70%)?

由于它不是更快并且闭包可以起到相同的作用,应该避免绑定吗?

javascript performance v8 node.js

76
推荐指数
2
解决办法
2万
查看次数

ES6类私有成员语法

我有一个快速的问题.在ES6课程中声明私有成员的最简洁明了的方法是什么?

换句话说,如何实施

function MyClass () {
  var privateFunction = function () {
    return 0;
  };

  this.publicFunction = function () {
    return 1;
  };
}
Run Code Online (Sandbox Code Playgroud)

class MyClass {

  // ???

  publicFunction () {
    return 1;
  }
}
Run Code Online (Sandbox Code Playgroud)

javascript private class ecmascript-6

6
推荐指数
1
解决办法
1228
查看次数

在仅nodejs的环境中的ES6模块/类中定义“真实”私有方法,而不会发生任何信息泄漏

我知道INSIDE ES6类中没有REAL私有方法。但是我在玩了一会儿,发现了一些好东西-也许...

正如我提到的,不可能不公开对象的属性。但是,当我将类划分为单独的文件,然后将这些类导出时,我试图实现某种OOP编程:

class MyClass {
  constructor() {
    /**
     * Initialize stuff...
     */
  }

  myMethod() {
    /**
     * Do public stuff...
     */
  }

}

// expose class to environment.
export default MyClass;
Run Code Online (Sandbox Code Playgroud)

所以我可以导入该类:

import MyClass from './MyClass.js';

当然myMethod可以从导入该模块的任何其他文件访问。既然我需要只能由该类访问的变量和函数,我已经尝试过了:

// private variable outside of class scope but still accessible.
let possiblePrivateVariable = 'am I a private variable?';

class MyClass {
  constructor() {
    /**
    * Initialize stuff...
    */
  }

  myMethod() {
    // run private method.
    console.log(_possiblePrivateMethod());
    // …
Run Code Online (Sandbox Code Playgroud)

javascript node.js ecmascript-6 es6-class es6-modules

6
推荐指数
1
解决办法
6537
查看次数

我应该如何测试 ES2015 类?

我的经验是使用静态类型语言,我必须承认,在尝试使用动态语言实现相同目标时,我感到迷茫。我想避免的一件事是应用在这种情况下没有意义的概念。请假设这个类属于我的项目,并且我们想用 Jasmine 测试它:

class MyEs6Class {
    constructor(
        collaborator1 = new MyCollaborator(),
        factory = new MyFactory()) {

        this.collaborator1 = collaborator1;
        this.factory = factory;
    }

    method() {
        // Code
    }
}
Run Code Online (Sandbox Code Playgroud)

我在构造函数中提供对象的默认实例,因为这允许我在测试时模拟它们。我正在尝试以与使用相同的方式使用控制反转,比如说 C#,但是使用语言的动态特性来避免依赖注入容器。这两个依赖是类所需要的,所以从结构上看,我觉得很明确,必须使用构造函数来提供。

另外,我使用工厂的概念只是因为当类处于“活动状态”时可能会多次需要工厂中的新对象。

从 ES6 类的角度来看,我知道私有和公共之间没有区别(/sf/answers/1949754971/),所以我可以在私有方法中让工厂处理逻辑,但依靠他的测试似乎是错误的。另一方面,仅仅因为我需要伪造返回的对象而拥有称为 factory 的东西似乎很奇怪,也许是在尖叫我缺乏知识。

  • 在这种情况下模拟合作者的正确方法是什么?
  • 仅仅因为我需要模拟返回的对象而拥有工厂的概念是否很愚蠢?
  • 在 Javascript/ES6 中隔离被测对象的一种可维护且优雅的方式是什么?我可以研究任何有趣的公共代码库?

javascript jasmine ecmascript-6

5
推荐指数
0
解决办法
206
查看次数