Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop - Fatal编程技术网

创建JavaScript类的正确、现代且跨浏览器安全的方法是什么?

创建JavaScript类的正确、现代且跨浏览器安全的方法是什么?,javascript,oop,Javascript,Oop,我对创建JS类的数百种方法感到困惑。一个说我应该使用原型,而另一个说没有人使用原型,因为它“不好”。另一方面,CoffeeScript使用原型,但使用返回自身(或其他)的函数包装构造。我见过返回对象的函数,返回返回对象的函数等等 我认为用一种语言创建类应该很简单,不需要框架——也许我遗漏了什么 还有两种(至少)创建方法:foo:function(){}和function foo(){}。我甚至在一节课上见过这两种方法。问题在于,第一种方法会导致创建无注释函数(它恰好被指定给对象的一个字段),调试

我对创建JS类的数百种方法感到困惑。一个说我应该使用原型,而另一个说没有人使用原型,因为它“不好”。另一方面,CoffeeScript使用原型,但使用返回自身(或其他)的函数包装构造。我见过返回对象的函数,返回返回对象的函数等等

我认为用一种语言创建类应该很简单,不需要框架——也许我遗漏了什么

还有两种(至少)创建方法:
foo:function(){}
function foo(){}
。我甚至在一节课上见过这两种方法。问题在于,第一种方法会导致创建无注释函数(它恰好被指定给对象的一个字段),调试器说错误发生在由无注释函数等调用的无注释函数中

我知道JS是功能性的,而不是OOP,但有时类是描述概念的最佳方式(例如,UI小部件希望成为类)


我很感激一个构造正确的类,很少有解释的话。

如果你对使用咖啡稿有信心,它对类有很好的处理方法,并且与其他任何OOP框架相比,你可以得到清晰的语法。

< P>我认为你可以考虑咖啡稿产生的“好”的代码:


我认为这篇文章很好地解释了这一点:


这是(我相信)在基于原型的语言(如javascript)中使用类的正确方法,并对概念进行了很好的解释。我在我的项目中使用这种方法,它似乎在所有现代浏览器中都能工作。

您可以将方法声明为
foo:function foo(){}
,而不会在调试程序中遇到问题。这是javascript的真正问题。JS权威机构没有任何文档,或者如果有,那么它就太复杂了(JavaScript是一种基于原型的语言,所以当你使用构造函数(“类”)时,你真的应该使用原型来添加功能。只有扩展其他非你自己的函数的原型才被认为是不好的做法——这就像修改类的代码。实际上我不想(不能)使用CoffeeScript。我只是看看其他人是如何做到这一点的。它看起来很合理,但它相当复杂。根据我的经验,当类变大时,这是值得的。
// Create a "class" named Foo = create a variable that contains whatever the
// self-invoking anonymous function returns (the function avoids the pollution
// the global namespace).
var Foo = (function() {

  // Create the "class" = the constructor function that is supposed to be used
  // with the "new" keyword to create instances (objects).
  function Foo() {}

  // Add a method "bar" (that's what the prototype is for!)
  Foo.prototype.bar = function(baz) {
    // Assign the value to a member variable of the current instance (this)
    this.foobar = baz;
  };

  // ...add more stuff.

  // Return only the function, every other local variable stays in this scope.
  return Foo;

})();