我认为Javascript本机OOP系统被认为是无类别的,并且是基于对象的,而不是基于类的。但是我看到的每个例子总是以类似于
的构造函数开头function Person(name) {
this.name = name;
}
只是通过这种方式使用构造函数,这是不是已经意味着正在使用一个类? (一个叫做Person的类)
详细说明:
如果我们可以使用
a.__proto__ = b;
在任何Javascript平台上,我认为它是无类别的。但我们做不到。如果我们想要这种行为,我们需要使用
function F() { }
F.prototype = b;
a = new F();
因此,必须使用构造函数。因此,如果构造函数是Javascript中的基石,那意味着它应该是Person,Widget等的构造函数,这些都是类。
答案 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
的。
您可以检查它是否包含预期的对象成员,并断定它是预期的类。
但是,如果对象成员一直在改变,那么你将无法获得所需/期望的结果。
JavaScript公开构造函数(适当地命名为 prototypes ),以便您可以定义用于构造普通对象的模板。
重要的是,原型调用的最终结果是普通对象,其中包含一些预定义成员,而不是某个类的对象。
答案 2 :(得分:1)
将javascript视为无类别环境是件好事。如果您认为javascript课程,您应该能够假设有一些有用的东西,当有课程时你可以做,并且它们是严格执行的。然而,你不能假设那些有用的东西。看起来像构造函数的东西的存在并不表示你正在创建一个类。
例如,假设你var dude = Person('Ashton Kutcher')
。现在,当你dude instanceOf person
时,你就会成真。您假设您拥有一个人的属性和方法。如果有些代码出现并说dude.personMethod = undefined
怎么办?现在,虽然dude instanceOf person
仍然有效,但personMethod
已不再可用。
您可以将javascript视为具有类,但它是一个漏洞的抽象。在确定什么是什么以及你可以期待什么时,最好将javascript视为具有原型继承系统。
答案 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