ES6 引入了类的概念,但其实底子里还是原型那一套。
以类 Person
为例:
class Person{constructor(){this.name = "jack";}
}
var o = new Person();
typeof Person; //Function
o.constructor === Person; //true
o instanceOf Person; //true
-
类有一个构造函数,new Person()时,实则是调用该构造函数
应用 new 操作符实例化 Person 的操作等于应用 new 调用其构造函数。惟一可感知的不同之处就 是,JavaScript 解释器晓得应用 new 和类意味着应该应用 constructor 函数进行实例化。
- 类做 typeof 运算时,返回的是
Function
类型 -
而后就是实例的 constructor,在上一篇笔记《了解原型》中就提到
// 在浏览器的控制台输出 o.constructor === o.__proto__.constructor; //true
Person 的 prototype 指向原型,实例 o 的
[[prototype]]
也是// 在浏览器的控制台输出 o.prototype === o.__proto__; //true
-
o instanceOf Person
返回 true,Person 在上下文中是function
类型,而在原型链继承中,原型也能够是一个实例,那么原型到底是什么?答:首先原型是一个对象。对象被认为是某个特定援用类型的实例。新对象通过应用 new 操作符后跟一个构造函数(constructor)来创立。构造函数就是用来创立新对象的函数。常见对象按类型分有两类:根本援用类型,汇合援用类型。根本援用类型:Date,RegExp, 原始值包装类型(Boolean,Number,String), 单例内置对象(Global,Math)等 汇合援用类型:Object、Array 等 其中属于根本对象的则是:Object、Function、Boolean、Symbol //MDN 的说法 所以 Person 作为 Function 的一个实例,是一个对象,能够作为原型。例子中的原型链是这样的:o--->Person(Function)---> 匿名对象(Object)--->null
辨别object
和Object
,前者是指类型为对象,是区别于原始值的援用值,后者Object
是汇合援用类型
ECMA-262 将对象定义为一组属性的无序汇合。严格来说,这意味着对象就是一组没有特定程序的 值。对象的每个属性或办法都由一个名称来标识,这个名称映射到一个值。正因为如此(以及其余还未 探讨的起因),能够把 ECMAScript 的对象设想成一张散列表,其中的内容就是一组名 / 值对,值能够是 数据或者函数。
每个 JavaScript 函数实际上都是一个
Function
对象。运行(function(){}).constructor === Function // true
便能够失去这个论断。
JavaScript 规范内置对象 –MDN Web Docs
对于 typeof
typeof
是一个运算符而不是函数, 用于判断根本类型(具体是哪种原始值)和各种援用类型(以 object
概括),返回值是字符串,可能的返回后果如下:
根本类型:undefined、null、number、boolean、string、symbol