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