如果Javascript的本机OOP是无类的,那么构造函数呢?这不意味着一堂课吗?

时间:2012-10-01 13:07:53

标签: javascript oop prototype

我认为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 个答案:

答案 0 :(得分:5)

Javascript中的OOP与Java OOP略有不同。 Javascript构造函数不引用类定义(因此它是无类别的)。相反,构造函数指的是原型。 Javascript中OOP的基础是Object对象(不是Object类),从中派生所有其他对象。

Prototyping授予您继承权,以及使用属性和方法扩展现有对象的可能性。

我建议你this article

在你的例子中:

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

Mike = new Person('Mike');

Person()函数允许您使用名为Object的新属性在name对象上创建原型的新对象。好吧,Javascript oop中的这种函数称为构造函数。

答案 1 :(得分:2)

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

JavaScript缺少类定义

它也没有类到对象的对应关系。

您无法检查使用Person等构造函数实例化的对象是 Person

您可以检查它是否包含预期的对象成员,并断定它是预期的类。

但是,如果对象成员一直在改变,那么你将无法获得所需/期望的结果。

TL; DR

JavaScript公开构造函数(适当地命名为 prototypes ),以便您可以定义用于构造普通对象的模板。

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

答案 2 :(得分: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

答案 3 :(得分:-2)

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

所以在上面的例子中

function Person(name)


 {
    this.name = name;
}

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

var personA = new Person(); personA.name =“james”;

var personB = new Person(); personB.name =“Tom”;

alert(personA.name + personB.name);

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