你们如何用JavaScript制作“课程”?
我正在使用:
function classFoo()
{
var classLevelVariable = 0;
this.classFunction = function()
{
alert("The classFunction has been called.");
classFunction2(); //Crash. classFunction2 is "undefined."
}
this.classFunction2 = function()
{
alert("classFunction2 called.");
}
}
我从来没有能够让施工人员工作。试图
this.New = function(arguments)
哪一次工作,但不是二等。所以,我现在已经完全放弃了这些,使用我自己的“初始化”函数作为构造函数。
它工作一次但不是两次的奇怪使我想到两个类之间的印刷错误......但我认为在19年的编码中,可能不是它。
我正在使用Chrome的调试器,除了第二个函数在被调用时未定义时,我没有收到任何错误。
答案 0 :(得分:8)
Javascript不使用基于类的继承。所以,你不能在Javascript中创建类,除非使用workarounds来模拟它们,这些是恕我直言并且很复杂的。
Javascript是一种原型语言。使用new
关键字基于构造函数对象的prototype属性创建一个新对象。
您可以在此处了解如何使用原型继承来基于原型对象实例化新对象:http://javascript.crockford.com/prototypal.html
答案 1 :(得分:7)
我觉得你原来的咆哮(见问题的修订历史)值得回应。在我看来,这非常违背编程和计算机科学的精神,仅仅因为你不能make it go而宣布一种语言被破坏。
如果我冒昧地告诉我,当我说我很惊讶他们可以将CS学位给那些具有这种范式无知的人时,我会感到诧异。当我去学校,这是只有大约5年前,我做了我的任务在6种不同的语言:MIPS,Verilog的,方案,Java和C / C ++和Python。我们使用了许多范例,包括功能和OOP,但也包括其他风格。如果你没有接触到这些不同的观点,其中没有一个是新的,那么你的教育就不完整了。
您是否认为您认为规范OOP 仅仅是OOP原则的一个表述?在Javascript对象中实例化“原型”,它与类不同。当您希望它像基于类的OOP语言一样工作时,它将无法满足您的期望。 Java和C ++不是OOP的黄金标准,OOP也不是所有编程的全部。
当人们考虑过去3 - 5年内用Javascript编写的令人惊叹的应用程序时,一个人可以做出这样的声明真是太神奇了:
有人会认为我们会在过去的六十年里将最好的编码方法应用到其中。不,当然不。我们有什么?函数内部的函数......类的一些奇怪的混蛋。完全没有一致性......
要这么说,尽管绚丽的JavaScript开发小组所取得的辉煌成就,语言被打破,因为的您的很难理解它,没错,是惊人的。
请注意,您现在可能不具备理解它所必需的视角,而不是语言存在缺陷。
答案 2 :(得分:5)
JavaScript是一种基于原型的编程语言。类的概念不存在或类的概念与对象相同。它与Java编程语言完全不同。不要被他们的名字所迷惑,这些相似之处就在那里。
我回来时问this question我。我得到了John Resig与these presentation slides的一个很好的链接。看一下,看看它是否有助于理解JavaScript和原型链。
答案 3 :(得分:2)
Here是sitepoint.com关于JavaScript中面向对象编程的好文章。
This javascriptkit.com上的一个更直接。
您可以使用函数创建一个对象集,其属性和函数如下:
person = new Object()
person.name = "Tim Scarfe"
person.height = "6Ft"
person.run = function() {
this.state = "running"
this.speed = "4ms^-1"
}
或使用构造函数:
function person(name,height,speed){
this.name = name;
this.height = height;
this.speed = speed;
}
var p1=new person('tom', '6ft','15kmph');
alert(p1.height);
或者您可以使用原型设计来扩展对象:
person.prototype.sayHello = function(){alert("Hi, I'm " + name;}
var p2 = new person('sam', '5.9ft', '12kmph');
p2.sayHello();//alert-> Hi, I'm sam
链接页面上有更深入的详细信息。
答案 4 :(得分:1)
JavaScript是Prototyping Language,因此情况略有不同。
以下是一段代码摘要:
(function(){ // create an isolated scope
// My Object we created directly
var myObject = {
a: function(x,y) {
console.log('a');
},
b: function(x,y) {
console.log('b');
this.a(x,y);
}
};
})();
(function(){ // create an isolated scope
// Create a Object by using a Class + Constructor
var myClass = function(x,y) {
console.log('myClass: constructor');
this.b(x,y);
};
myClass.prototype = {
a: function(x,y) {
console.log('myClass: a');
},
b: function(x,y) {
console.log('myClass: b');
this.a(x,y);
}
};
// Define a function that should never inherit
myClass.c = function(x,y) {
console.log('myClass: c');
this.a(x,y);
};
// Create Object from Class
var myObject = new myClass();
// Will output:
// myClass: constructor
// myClass: b
// myClass: a
// Define a function that should never inherit
myObject.d = function(x,y) {
console.log('myObject: d');
this.a(x,y);
};
// Test the world is roung
console.log(typeof myClass.c, 'should be undefined...');
console.log(typeof myClass.d, 'should be function...');
})();
(function(){ // create an isolated scope
// If you are using a framework like jQuery, you can obtain inheritance like so
// Create a Object by using a Class + Constructor
var myClass = function(x,y) {
console.log('myClass: constructor');
this.b(x,y);
};
myClass.prototype = {
a: function(x,y) {
console.log('myClass: a');
},
b: function(x,y) {
console.log('myClass: b');
this.a(x,y);
}
};
// Create new Class that inherits
var myOtherClass = function(x,y) {
console.log('myOtherClass: constructor');
this.b(x,y);
};
$.extend(myOtherClass.prototype, myClass.prototype, {
b: function(x,y) {
console.log('myOtherClass: b');
this.a(x,y);
}
});
// Create Object from Class
var myOtherObject = new myOtherClass();
// Will output:
// myOtherClass: constructor
// myOtherClass: b
// myClass: a
})();
(function(){ // create an isolated scope
// Prototypes are useful for extending existing classes for the future
// Such that you can add methods and variables to say the String class
// To obtain more functionality
String.prototype.alert = function(){
alert(this);
};
"Hello, this will be alerted.".alert();
// Will alert:
// Hello, this will be alerted.
})();
有一些图书馆可以帮助解决这个问题,例如:
答案 5 :(得分:-2)
使用Prototype javascript框架。