Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.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_Functional Programming_Abstract Class - Fatal编程技术网

“最佳实践”;“摘要”;JavaScript中的函数?

“最佳实践”;“摘要”;JavaScript中的函数?,javascript,functional-programming,abstract-class,Javascript,Functional Programming,Abstract Class,我刚刚编写了一些JavaScript代码,我认为这是创建带有闭包和一些函数的对象的良好实践: var myStuff = (function() { var number = 0; var fn = {}; fn.increment = function() { number++; }; fn.decrement = function() { number--; }; fn.getNumber = function() { return number; }; return fn; }

我刚刚编写了一些JavaScript代码,我认为这是创建带有闭包和一些函数的对象的良好实践:

var myStuff = (function() {
 var number = 0;
 var fn = {};
 fn.increment = function() { number++; };
 fn.decrement = function() { number--; };
 fn.getNumber = function() { return number; };
 return fn;
})();

myStuff.increment();
myStuff.increment();
alert(myStuff.getNumber()); // alerts '2'
我可以像前面的代码片段一样编写代码。我想写一些功能类似于OOP“抽象”类的代码。以下是我努力的结果:

var myStuff = (function () {
var number = 0;
var fn = {};
fn.increment = function () { number++; };
fn.decrement = function () { number--; };
fn.doSomethingCrazy = function () { throw new Error('not implemented'); }; // I want to specify later what this does.
fn.doSomethingCrazyTwice = function () { fn.doSomethingCrazy(); fn.doSomethingCrazy(); };
fn.getNumber = function () { return number; };
return fn;
})();

myStuff.doSomethingCrazy = function () { this.increment(); this.increment(); };
myStuff.doSomethingCrazyTwice();
alert(myStuff.getNumber()); // alerts '4'
上面的代码片段可以工作,但看起来并不优雅。也许我正试图强迫JavaScript(一种函数式语言)做一些它不是设计用来做的事情(对象继承)


在JavaScript中定义对象以便以后可以定义该对象的函数的好方法是什么?

只是不要定义函数

Javascript是一种鸭子类型的语言。如果它看起来像一只鸭子,并且像鸭子一样嘎嘎叫,那它就是一只鸭子。
你不需要做任何特殊的事情来完成这项工作;只要调用时函数存在,它就可以正常工作


如果您在没有该函数的实例上调用它,您将在调用站点上得到一个错误。

如果您没有找到合适的方法,可能有一种方法可以创建一些函数来简化流程,使其看起来更好。但是回到话题上来

是的,Javascript通过原型内置了委托,即继承

给定一个原型对象:

var proto = {
    f: function(){ console.log(this.x); }
}
我们可以创建一个从中继承的新对象:

var obj = Object.create(proto);
obj.x = 42;

obj.f(); //should work!

for(var i in obj) console.log(i);
//should print x, f and some other stuff perhaps
请注意,并不总是支持通过Object.create直接执行操作(旧浏览器等)。旧的(有些人可能会说,正常的)做事方式是通过funkynew操作符(不要过多地考虑这个名字——它故意让Java人分心)



<> P>与原型继承考虑的一个重要区别是缺乏私有变量。只能继承公共变量!正因为如此,一个常见的惯例是使用下划线作为私有变量和受保护变量的前缀。

您可能想看看上一篇文章

我只是为您提供一些关于OOP和JavaScript的轻松阅读的网站,我假设您的新JavaScript是基于您所说的评论的OOP语言


我同意SLaks,没有必要定义函数,但我倾向于这样做。这是因为对我来说,重要的部分在文档中。当有人阅读我的类时,我想让大家清楚,必须实现这些方法,传递什么参数,应该返回什么

这是一份工作文件中的内容。一个特性有多个实现,其基类每隔一段时间进行数据加载

/**
 * Called when data is received and should update the data buffer
 * for each of the charts 
 * 
 * @abstract
 * @param {cci.ads.Wave[]} waves
 * @void
 */
updateChartsData: function(waves){
    throw "Abstract method updateChartsData not implemented";
},
2019年更新


如果可以,请使用TypeScript,因为我们的团队在不断壮大,我们的javascript项目也越来越复杂,我们也必须开始实现OO特性

在我们的javascript“抽象”方法中,我们只是抛出一个错误,或者弹出一个警报。这是out Page对象的一个示例:

Page.initialLoad = function() { //abstract
    alert('Page.initialLoad not implemented');
};
在java世界中,有必要:

public void abstract initialLoad();
Java代码给出了一个编译时错误,但是在Javascript中我们会得到一个运行时错误。(一个脏错误对话框,表示实现对象尚未实现该方法)

我们有许多使用页面对象的不同团队;“鸭子打字”的哲学绝对不适合我们。没有这些伪“抽象”方法,我们通常缺乏API通信,有时我们会破坏超级对象(即,因为用户不知道他们应该实现该方法)


我厌倦了这种“鸭子打字”的哲学。我不确定支持者是否参与过一个有10多名开发人员的复杂Javascript项目。

如您所见,我特别强调从同一对象中的另一个函数调用我的“抽象”函数。@Rice:这没有什么区别;这就是duck typed的意思。JavaScript支持面向对象、命令式和函数式编程(或者更确切地说,脚本)。JavaScript中的一切都是为了分散Java人员的注意力:从语言名称一直到二进制运算符和“new”关键字!:-)Object.create的第二个参数应为propertyDescriptor@Raynos:修正了大脑放屁;把旧的Crockford对象记在心里,lol@missingno您可能需要查看,因为您选择了
.x=42
而不是
{x:{value:42}
不要这样做。这是一种反模式。使函数成为可选的,而不是抽象的。或者,如果有人提供给你一个没有函数的对象,你就崩溃并烧掉它。@Raynos:它的哪一部分是反模式的?想提供一些推理吗?语言中没有抽象的概念。这也不是必要的。尤其是
\uuu
内部方法。这只是一个糟糕的设计。@Raynos:仅仅因为一种语言没有这个概念,并不意味着它没有用处。拥有一个基空函数可能是不可取的,因为它是空的。然而,我发现不可接受的是没有在抽象类中记录如何调用该方法,这是我不喜欢的
只是没有定义函数。如果您选择使所有的
抽象方法都不带下划线,那很好,我们的约定是使用下划线,因为这些方法不应该从类外部调用,只要保持一致即可。@Raynos:基类上的抽象方法是实现依赖项反转原则的标准方法。我的示例是一个用例,用于对象的不同实现,因此子类不必担心其他细节,它们只需要知道在需要时将调用一个方法
public void abstract initialLoad();