JavaScript类是一个对象吗?

时间:2018-03-16 12:32:08

标签: javascript ecmascript-6

我假设ES6类是一个对象,因为“一切”是JavaScript中的对象。这是正确的假设吗?

5 个答案:

答案 0 :(得分:4)

Object Oriented Programming 的角度来看,不是 对象。它是抽象。而且每个对象都是抽象的具体实例。

从JavaScript的角度来看, class 对象,因为 class ES6 功能在它下面使用简单的功能。它不仅仅是Javascript中的抽象,而且还是一个对象。而这个功能是一个对象。它拥有自己的属性和功能。

所以在Javascript中说不是一切都是对象。还有来自number的原始类型 - stringbooleanundefinedsymbolES6。当您使用除undefined之外的这些原始类型的某些方法时,它们将被转换为对象。

您可以看到以下示例。



const str = 'Text';
const strObj = new String('Text');

console.log(str);
console.log(strObj.toString());

console.log(typeof str);
console.log(typeof strObj);




还有一个额外的基本类型null,但检查它的类型会返回对象。这是一个错误。



console.log(typeof null);




答案 1 :(得分:3)

ES6类是一个函数:

(class {}) instanceof Function === true

任何函数都是一个对象:

(class {}) instanceof Object === true

答案 2 :(得分:2)

是的,是的。

如果你这样做:

class Hello { };

然后Hello本身就是一个可以像其他任何一样使用的对象:

console.log(Hello.toString()); // outputs 'class Hello { }'

正如您所说,JavaScript中的 eveything 是一个对象

事实上:

console.log(Hello instanceof Object); // prints 'true'

答案 3 :(得分:1)

真正的问题是Javascript类是否是

实际上他们不是。 Javascript的对象模型是基于原型的,而不是基于类的,这使得它很难理解。 class语法是一个有用的工具,但实际上只有语法糖才能使模型更容易理解。

实际上,JS类实际上是一个函数,其原型与之相关。

class Hippo{};
Hippo.__proto__ === Function.prototype; // true

所有JS函数都是对象。

Hippo.__proto__.__proto__ === Object.prototype; // true

更漂亮的说法是

Hippo instanceof Object; // true

所以JS类是一个对象和一个函数 - 但它实际上不是一个类!

答案 4 :(得分:0)

Class是Javascript中的一个函数,只有函数有原型属性,而不是对象。

检查以下代码

class MyClass {}
MyClass.prototype.value = 'My Class Value'; // Works same as function
const myclass = new MyClass();
console.log(myclass.value);

function MyFunc() {}
MyFunc.prototype.value = 'My Function Value';
const myfunc = new MyFunc();
console.log(myfunc.value);

var MyObject = {};
MyObject.prototype.value = 10; // Throws an error