如何在JavaScript中声明父类和子类?

时间:2011-07-09 03:42:11

标签: javascript class inheritance standards member-functions

我不喜欢javascript的一件事是有数百种方法可以做。我想知道的是,我该如何申报课程?我是否使用function()方法?我是否打电话给Class.create()?什么是'标准做法'?宣布成员职能的“标准做法”是什么?我使用原型吗?我使用myClass.method()吗?最后,我如何做基本的亲子继承?我问的原因是因为在互联网上我收到了很多方法来做这些事情。我想知道什么是'标准练习'。

3 个答案:

答案 0 :(得分:1)

我的建议是您阅读Stoyan Stefanov撰写的JavaScript Patterns。他详细介绍了这个主题。

就个人而言,我更喜欢Module Pattern。它减少了全球空间污染,并且易于使用。

修改

其他答案在实例化其“类”时遗漏了new关键字。有关正确实例化JavaScript“类”的详细讨论,请参阅答案383503

答案 1 :(得分:1)

在Javascript中没有用于声明类和特别是子类的“标准实践”的原因是Javascript实际上没有内置的语法语言支持,可以在C ++中找到典型的类。相反,它有自己的技巧如何生成类似的功能,并有很多不同的方式来表达这些技巧。确实没有标准的方式。

我发现最好使用一个更常见的javascript库(jQuery,Prototype,YUI,Closure等等),然后使用它们提供的子类化功能,这将为您提供自己的“标准”这样做的方式。如果你不想使用其中一个库,你需要从某个地方借用一些代码进行子类化(相当于YUI的extend()函数),然后决定你想要使用哪种样式。

我个人认为这是大型项目中的Javascript的弱点,有多个人在他们上面工作的项目或者其他人需要扩展的项目,没有语言语法来声明类和子类的“方法”。相反,拥有一致代码库的唯一方法是决定你自己将使用什么样的声明,然后将其强制作为项目中的编码标准,就像使用大括号样式或缩进一样风格。

答案 2 :(得分:1)

绝对同意其他海报,因为那里没有你所描述的“标准做法”。我将分享我现在使用的内容,这与Douglas Crawford在他的书The Good Parts中使用的内容类似。我并没有声称它是完美的,但是我很长时间对这个问题感到沮丧,当我希望以OOP方式组织JS代码时,这对我来说很有用。

var ParentClass = function () {
  var my = {},  // store private member variables and functions
    that = {};  // store public member variables and functions
  my.privateVar = 0;
  that.publicVar = 7;

  // this won't be visible outside of parent class,
  // even to children unfortunately
  my.getPrivateVar = function () {
    return my.privateVar;
  };

  my.privateFunction = function () {
    // do stuff
  };

  // this will be visible to children classes and anyone
  // else using ParentClass
  that.parentFunction = function () {
    // here we can access private vars and functions
    my.privateVar++;
    my.privateFunction();
  };

  // and here we return the object that we created
  // to store the public member variables and functions
  return that;
};

var ChildClass = function () {
  var my = {}, // more private vars and functions will live here
    that = ParentClass();  // and here we subclass ParentClass;

  // here define more public, private methods as before
  that.childFunction = function () {
  };

  return that;
};

// test drive it
var cc = ChildClass();
cc.parentFunction();
cc.childFunction();
console.debug(cc.publicVar);
// console.debug(cc.privateVar);  // undefined