要使用公共方法创建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_food和use_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的几次写法,但看起来似乎不能通过公共方法调用"私有"方法,并且可以在外部调用"特权"方法.
是否可以在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中询问了Function.bind vs Closure:如何选择?
并且部分收到了这个答案,这似乎表明bind应该比闭包更快:
范围遍历意味着,当您要获取存在于不同范围内的值(变量,对象)时,会增加额外开销(代码执行速度变慢).
使用bind,您将调用具有现有范围的函数,因此不会进行范围遍历.
两个jsperfs表明bind实际上比闭包慢得多.
这是作为对上述评论发布的
并且,我决定编写自己的jsperf
那么为什么绑定这么慢(铬+ 70%)?
由于它不是更快并且闭包可以起到相同的作用,应该避免绑定吗?
我有一个快速的问题.在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) 我知道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) 我的经验是使用静态类型语言,我必须承认,在尝试使用动态语言实现相同目标时,我感到迷茫。我想避免的一件事是应用在这种情况下没有意义的概念。请假设这个类属于我的项目,并且我们想用 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 ×6
ecmascript-6 ×4
class ×2
node.js ×2
es2015 ×1
es6-class ×1
es6-modules ×1
jasmine ×1
oop ×1
performance ×1
private ×1
v8 ×1