我的编程背景主要是Java,C++和C#。我最近一直在从事Javascript和Web开发,并且对使用Javascript和JQuery进行诸如操作DOM元素之类的事情有基本了解,并且我在前端需要执行任何其他操作。
但是,我似乎无法绕开JS的原型(prototype)。我已经阅读了几篇有关它的文章和答案,但是对我来说仍然没有任何意义。我认为让我正确理解它的最好方法是在JS原型(prototype)和C++ / Java类之间进行某种比较。
所以我的最后一个问题是:
来自Java / C++背景,我需要知道什么才能有效地在代码中使用原型(prototype)?
旁注:this之类的问题谈论两者之间的哲学差异。我真正希望获得的解释是如何针对那些已经了解如何在C++中使用类的人使用原型(prototype)进行编程。
最佳答案
原型(prototype)以及为何如此出色。
在开始之前,Mozilla可以比我更好地编写此指南:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript
就像您一样,我也有传统的OO语言背景,我真正学习的第一门编程语言是C++,我认为那是最伟大的。在许多方面,C++是一种很棒的语言,这就是在其中使用the best JavaScript engine进行编码的原因。
但是,不同之处在于JavaScript的工作方式。 C++是严格类型化的,并且类必须包含它们所包含的确切数据类型:
class Rectangle {
int width, height;
public:
void set_values (int,int);
int area() {return width*height;}
};
与C++不同,JavaScript中的几乎所有内容都是
Object
,并且可以通过点符号轻松扩展var derek = "Derek Howard";
derek.age = 16;
由于JavaScript是即时编译的,因此非常灵活。而不是
Object
可以是什么的僵化骨架,我们可以随时扩展现有对象。但是,在许多情况下,我们希望拥有一大堆看起来相同但具有自己数据的对象(例如C++中的类)。这是
prototype
对象起作用的地方。如何在Javascript中创建“类(class)”?
我将在JavaScript中重新创建上面的矩形对象以进行演示。
第一步是创建一个定义您的类名称的
Function
。应该大写以表示它是“类”第一个函数(大写的那个函数)是您的构造函数。您应该使用它来将基本的初始值传递给
Object
function Rectangle(width, height) {
this.width = width || 1;
this.height = height || 1;
}
||
运算符可以实现,因此,如果开发人员未将值传递给构造函数,它仍然具有默认值。然后,要将功能添加到“类”中,您将需要在原型(prototype)上创建功能。
Rectangle.prototype.area = function () {
return this.width * this.height;
}
完成创建类(class)!现在使用您的类(class)。
使用该类实际上与C++非常相似。您只需创建一个对象并使用
new
关键字:var bigRec = new Rectangle(42, 100);
然后,您可以直接在新对象上调用在
Rectangle.prototype
上创建的函数:alert(bigRec.area());
完整代码(JSFiddle:http://jsfiddle.net/howderek/H65qs/)
//new class
function Rectangle(width, height) {
//class properties
this.width = width || 1;
this.height = height || 1;
}
//class functions
Rectangle.prototype.area = function () {
return this.width * this.height;
}
//create a new Rectangle object
var bigRec = new Rectangle(42, 100);
//call functions created from the prototype
alert(bigRec.area());