如何在JavaScript中模拟类(和命名空间)?
我需要创建一个JavaScript库,并且对该语言的使用经验有限.我一直认为它对类有本机支持,但它与Java的相关性低于我的假设.似乎JavaScript中的所有内容实际上都是一个函数.
到目前为止我发现它是一种动态的弱类型语言很有意义,但这对于那些习惯使用强类型语言并使用编译器来发现错误的人来说有点偏离: )
我主要使用C#和Java,并且希望语法类似,所以对于我们需要维护它的其他C#开发人员来说,这个库看起来很熟悉.
我有以下类型的代码可以工作,但我想知道其他开发人员将采取什么措施.有哪些替代方案?有没有更好的方法?有没有更可读的方法?
我明白我想要的是类似于C#或Java的东西,我应该接受这个是JavaScript的事实,但我的目标是通过让它更熟悉和直观来减轻其他开发人员的学习曲线.
//Perform the namespace setup (this will actually be done with checking
//in real life so we don't overwrite definitions, but this is kept short
//for the code sample).
var DoctaJonez = new function();
DoctaJonez.Namespace1 = new function();
/**
* Class description.
*/
DoctaJonez.Namespace1.SomeClass = function()
{
/**
* Public functions listed at the top to act like a "header".
*/
this.publicFunction = privateFunction;
/**
* Private variables next.
*/
var privateVariable; …Run Code Online (Sandbox Code Playgroud) 在下面这个问题的答案做了伟大的工作,解释之间的差异classical inheritance和prototypal inheritance.这是我感兴趣的,因为我开始使用Java,但转移到Javascript.
在他的回答中,他说prototypal inheritance,"关于课程的所有业务都会消失.如果你想要一个对象,你只需要写一个对象."
然而,关于如何在Javascript中"编写类" 有很多文档和问题.
为什么要推动语言不是.我正在寻找具体的例子,在这种情况下,使用JS应用程序中的类在这种原型语言中更为明智,以及将方形钉固定在圆孔中的好处.正如Aravind所说的那样,为什么人们通过将Javascript与其他人进行比较来学习Javascript,而不是因为它的目的......并且为什么这种做法似乎受到鼓励?
底线问题:为什么要在ECMAScript 6中引入类?
new到目前为止,我一直在使用JavaScript中的关键字.我一直在阅读Object.create,我想知道是否应该使用它.我不太明白的是我经常需要运行构造代码,因此我看不到Object.create它将如何工作,因为它不会触发任何运行的函数.
谁能告诉我,在哪种情况下我应该使用Object.create而不是new?
我是一名开发人员,拥有大约9年的Java和C#背景历史.
在那些语言中,类和分类分类以及对象范例固有.
因此,当ECMA6出来时,我很高兴看到语言课程......我开始在各处使用它们.
事实证明,在JavaScript中使用类是一个陷阱.
你永远不会真正理解JavaScript.你会认为你这样做,但你没有.
很明显,在看完这个完整的会议后,我意识到我不懂JavaScript.
我的生活中我已经使用OOP格式化了类范例,现在我甚至不知道在哪里寻求帮助,甚至不知道如何开始.
非JavaScvript的一个例子:
class Animal{
constructor(aName){
this.name = aName;
}
}
class Dog extends Animal{
constructor(){
super(aName);
this.type = "Furry dog";
}
}
let myDog = new Dog("Boby");
Run Code Online (Sandbox Code Playgroud)
在这一点上,我正在寻找指导.在尝试之后我找不到任何有用的东西,主要是因为我相信我迷失了以至于我甚至都没有找到正确的东西.
提前致谢.
可能重复:
在javascript中定义类的最佳方法是什么
你是如何用Javascript编写一个类的?它甚至可能吗?
在 PHP 中,你可以这样做:
class myClass() {
function doSomething(someVar) {
// do something here
}
// etc... (other methods and properties)
}
Run Code Online (Sandbox Code Playgroud)
然后,当然,您可以在实例化类后调用该方法,如下所示:
$myObj = new myClass();
$myObj->doSomething();
Run Code Online (Sandbox Code Playgroud)
但是您也可以选择将该方法作为独立函数调用,而无需实例化该类(但您必须注意该函数中的依赖项),如下所示:
myClass::doSomething();
Run Code Online (Sandbox Code Playgroud)
我相信它是为 C++ 借来的东西......它被称为范围解析运算符(PHP 代码中的 Paamayim Nekudotayim......)
http://en.wikipedia.org/wiki/Scope_resolution_operator#PHP
http://www.php .net/manual/en/language.oop5.paamayim-nekudotayim.php
你会如何在 JavaScript 中做这样的事情?这似乎是不可能的。也许我以错误的方式接近这个,我应该透露我想要实现的目标......
我只有一个函数,它是这样的:
function submitContactForm(form) {
// pretty JavaScript...
}
Run Code Online (Sandbox Code Playgroud)
我很高兴它是一个函数。但我想实现一个“resetContactForm()”,但希望以某种方式将它附加到 submitConatctForm 函数。
我知道我可能会这样做:
var contactForm = {
"submit" : function(form) {
//...
},
"reset" : function(form) {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
我会像那样回答我自己的问题......
但是,除了我不喜欢这种语法,并想避免它之外,还有一个事实是,上面的结构不能用作类定义,它与 PHP 中的不一样......所以回到最初的问题:有没有办法让 JavaScript 结构可以同时用作类定义和独立函数的集合?
我想在Javascript中创建一个类.这堂课应该有
怎么做到这一点?
// Define a class like this
function Person(name, gender){
// Add object properties like this
this.name = name;
this.gender = gender;
}
// Add methods like this. All Person objects will be able to invoke this
Person.prototype.speak = function(){
alert("Howdy, my name is" + this.name);
}
// Instantiate new objects with 'new'
var person = new Person("Bob", "M");
// Invoke methods like this
person.speak(); // alerts "Howdy, my name is Bob"
Run Code Online (Sandbox Code Playgroud)
如何定义命名空间?
我已经搜索了一种在 javascript 中定义类的方法,比如在 java 或 php 中,但我没有找到!
我想要类似的东西
class javascriptClass {
function someFunction(){}
}
Run Code Online (Sandbox Code Playgroud) javascript 中没有实际的类。但你必须利用你所得到的东西。
让我们以“类”为例:
var example = function (string) {
this._self = string;
}
Run Code Online (Sandbox Code Playgroud)
通过以上内容,您可以执行以下操作:
var ex = new example("Hello People."),
display = ex._self; // returns "Hello People."
Run Code Online (Sandbox Code Playgroud)
我想通过使用类似的东西example.prototype.newFun = function(){}会向该“类”添加一个新属性。但它在我的代码中不起作用。
这是我正在测试的完整代码:
var example = function (string) {
this._self = string;//public, var like, storage
}
var showExample = new example("Hello People");
showExample.prototype.display = function (a) {//code stops here, with error "Uncaught TypeError: Cannot set property 'display' of undefined"
return a;
}
console.log(showExample._self);
console.log(showExample.display("Bye"));
Run Code Online (Sandbox Code Playgroud)
我想做的是将display函数作为“公共函数”添加到示例函数中。我可能做错了什么。
阅读可以使用哪些技术在JavaScript中定义一个类,以及它们的权衡取舍是什么?在stackoverflow上我明白我可以通过定义一个类
方法1:
function Person(name, gender){
this.name = name;
this.gender = gender;
}
Run Code Online (Sandbox Code Playgroud)
并在原型中添加函数,以避免每次实例化时重新创建成员函数.喜欢
Person.prototype.speak = function(){
alert("my name is" + this.name);
}
Run Code Online (Sandbox Code Playgroud)
并通过创建其实例
var person = new Person("Bob", "M");
Run Code Online (Sandbox Code Playgroud)
我认为使用新的关键字就可以创建相同的对象
方法2:
var Person = function (name, gender) {
return {name:name, gender:gender};
}
person = Person("Bob", "M");
Run Code Online (Sandbox Code Playgroud)
第二种方法是否完成了第一种方法完成相同的操作?如果是这样的话,我将如何在第二种方法中通过原型模拟添加函数(正如我们在方法1中所说的那样)?
javascript ×11
class ×4
oop ×3
prototype ×2
ecmascript-5 ×1
ecmascript-6 ×1
inheritance ×1
object ×1
php ×1