如果Javascript';s的本机OOP是无类的,那么构造函数呢?不';这不意味着阶级吗?

如果Javascript';s的本机OOP是无类的,那么构造函数呢?不';这不意味着阶级吗?,javascript,oop,prototype,Javascript,Oop,Prototype,我认为Javascript本机OOP系统据说是无类的,是基于对象的,而不是基于类的。但是我看到的每个例子都是从一个类似于 function Person(name) { this.name = name; } 仅通过这种方式使用构造函数,这不就意味着正在使用类吗?(一个叫做Person的类) 详情: 如果我们能使用 a.__proto__ = b; 在任何Javascript平台上,我认为它都是无类的。但我们不能那样做。如果我们想要这种行为,我们需要使用 function F()

我认为Javascript本机OOP系统据说是无类的,是基于对象的,而不是基于类的。但是我看到的每个例子都是从一个类似于

function Person(name) {
    this.name = name;
}
仅通过这种方式使用构造函数,这不就意味着正在使用类吗?(一个叫做Person的类)


详情:

如果我们能使用

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

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

因此,必须使用构造函数。所以,如果构造函数是Javascript的基石,那就意味着它是Person、Widget等的构造函数,这些都是类。

无类可能是描述Javascript面向对象方法的不准确的方式

JavaScript确实缺少类定义

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

无法检查使用构造函数(如
Person
实例化的对象是否属于类
Person

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

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

TL;博士 JavaScript将构造函数(适当命名的原型)公开为一种可以定义用于构造普通对象的模板的方式


重要的是,原型调用的最终结果是一个带有一些预定义成员的普通对象,而不是某个类的对象。使用对象构造函数创建一个类,原型可以帮助我们 在创建类的多个实例时,无需在每次需要时重新定义对象

在上面的例子中

function Person(name)


 {
    this.name = name;
}
您可以创建两个姓名不同的人。 例如:

var personA=newperson(); personA.name=“詹姆斯”

var personB=新人(); personB.name=“汤姆”

警报(personA.name+personB.name)

我建议您阅读此链接将有所帮助

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

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

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


这里有更多信息:

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

原型设计赋予您继承性,以及使用属性和方法扩展现有对象的可能性

我建议你

在您的示例中:

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

Mike = new Person('Mike');

Person()函数允许您使用名为
name
的新属性在
对象上创建一个新的原型对象。那么,JavaScript OOP中的这种函数被称为构造函数。

您不考虑<代码>实例> <代码>来提供类到对象对应吗?代码>人的fred实例是的,但由于它可以在运行时动态重写,因此无法保证该行为是一致的。例如,您有一个框架,比如
qxoo
,您实现了一个“向下转换”或“向上转换”功能(我不知道他们是否这样做),可以更改对象的原型。你的上帝现在在哪里?看看你的小提琴:我已经变异了弗雷德,把他变成了一个窗口,可怜的弗雷德。为什么使用函数会比使用变量赋值更让它充满类呢?您可以在普通的旧C语言中使用structs创建结构化对象,并使用诸如
new\u Person()
之类的函数使其看起来像一个类。但是您仍然在一个无类环境中使用OOP结构。它是框架的一部分,它建立在这个抽象的基础上,实现了一个完整的面向应用程序的JavaScript库。还有一个称为[Objective-J]()的抽象,它同样支持一个我不太了解的框架,但这个框架不是本机JavaScript,它被编译为JavaScript(动态)还有一个问题,但这不是本机JavaScript,也不是编译为JavaScript(动态)-1您没有回答这个问题。OP知道JavaScript允许这种行为。他在问为什么JavaScript经常被称为“无类”。看看@user1689607的提琴:可怜的弗雷德,我已经变异了弗雷德,把他变成了一个窗口。所以我认为Crockford的
Object.create()
成功应用于ECMA-262或ECMAScript 5.1。我想知道它是叫
Object.createFrom()
还是叫
Object.inheritFrom()
也许更准确?