3

我认为 Javascript 原生 OOP 系统据说是无类的,并且是基于对象的,而不是基于类的。但是我看到的每个示例总是以类似于以下的构造函数开头

function Person(name) {
    this.name = name;
}

仅仅通过这种方式使用构造函数,这不是已经暗示正在使用一个类吗?(一个叫做 Person 的类)


细节:

如果我们可以使用

a.__proto__ = b;

在任何 Javascript 平台上,那么我认为它是无类的。但我们不能那样做。如果我们想要这种行为,我们需要使用

function F() { }
F.prototype = b;
a = new F();

因此,必须使用构造函数。因此,如果构造函数是 Javascript 中的基石,则意味着它旨在成为 Person、Widget 等的构造函数,而这些都是类。

4

4 回答 4

5

The OOP in Javascript is slightly different from, for instance, the Java OOP. The Javascript constructors do not refer to a class definition (so it is classless). Rather the constructor refers to a prototype. The base of the OOP in Javascript is the Object object (not the Object class), from where all the others objects are derived.

Prototyping grants you inheritance, and the possibility to extend an existing object with properties and methods.

I suggest you this article.

In your example:

function Person(name) {
    this.name = name;
}

Mike = new Person('Mike');

the Person() function lets you create a new object prototyped on the Object object with a new property called name. Well, such a kind of function in Javascript oop is called a constructor.

于 2012-10-01T13:29:56.117 回答
3

无类可能是描述 JavaScript 在 OOP 上的方法的不准确方式。

JavaScript 确实缺少类定义

它还缺少类到对象的对应关系。

您无法检查使用构造函数(例如Personis of class Person )实例化的对象。

您可以检查它是否包含预期的对象成员并得出结论它属于预期的类。

但是,如果对象成员在此过程中发生了更改,您将不会获得所需/预期的结果。

TL;博士

JavaScript 公开构造函数(适当命名的原型)作为您可以定义用于构造普通对象的模板的方式。

重要的是原型调用的最终结果是一个带有一些预定义成员的普通对象,而不是某个类的对象

于 2012-10-01T13:11:47.887 回答
1

将 javascript 视为无类环境是件好事。如果您认为 javascript 类,您应该能够假设当有类并且它们被严格执行时,您可以做一些有用的事情。但是,您不能假设那些某些有用的东西。看起来像构造函数的东西的存在并不表示您正在创建一个类。

例如,假设你var dude = Person('Ashton Kutcher')。现在,当你 时dude instanceOf person,你会变得真实。你假设你有一个人的属性和方法。如果出现一些代码并说dude.personMethod = undefined. 现在,虽然dude instanceOf person仍然是正确的,但personMethod不再可用。

您可以将 javascript 视为具有类,但它是一个泄漏的抽象。在确定某物是什么以及您对它的期望时,最好将 javascript 视为具有原型继承系统。

更多信息在这里:http: //javascript.crockford.com/prototypal.html

于 2012-10-01T13:26:20.820 回答
-2

使用对象构造器创建一个类,原型设计可以帮助我们创建该类的许多实例,而无需在每次需要时重新定义对象。

所以在上面的例子中

function Person(name)


 {
    this.name = name;
}

你可以创建两个不同名字的人。例子 :

var personA = new Person(); personA.name = "詹姆斯";

var personB = new Person(); personB.name = "汤姆";

警报(personA.name + personB.name);

我建议您阅读此链接会有所帮助 http://www.javascriptkit.com/javatutors/oopjs2.shtml

于 2012-10-01T13:21:39.153 回答