在经典的面向对象编程语言中,比如java,都会有类的概念,类是对象的模板,对象是类的实例化。在js这种弱类型语言中是没有类的概念的。因为JavaScript是通过构造函数(constructor)和原型链(prototype chains)来实现的。
ES6引入了类的概念,通过class可以定义类。
构造函数
构造函数就是提供了一个生成对象的模板并描述对象的基本结构的函数,也就是说一个构造函数可以生成多个对象,
prototype
基本上所有对象的原型链顶层都是Object.prototype,而且Object.prototype没有原型,当然Object.create(null)创建的对象也没有原型。
私认为原型的用途在于让对象可继承原型上的属性,达到功能复用,代码复用的目的。
内置对象的原型链结构
函数 Function.声明的每个函数 -> Function.prototype –> Object.prototype -> null
数组对象 -> Array.prototype -> Object.prototype -> null
对象直接量创建的对象 -> Object.prototype -> null
日期对象 -> Date.prototype -> Object.prototype -> null
正则对象 -> RegExp.prototype -> Object.prototype -> null
在控制台打出可见 大概意思是说,五岁小孩a的太爷爷也是人
自定义对象的原型链结构
自定义的对象原型结构
自定义构造函数创建的对象 -> {} -> Object.prototype -> null
虽然自定义的对象指向了空对象,但是这个空对象继承了Object.prototype。
<script>
var a = 1;
var b = function(){}
console.log(a.prototype)//undefined
console.log(b.prototype)//Objectconstructor: ƒ ()length: 0name: "b"arguments: nullcaller: nullprototype: {constructor: ƒ}__proto__: ƒ ()[[FunctionLocation]]: Untitled-1.html:3[[Scopes]]: Scopes[1]__proto__: Objectconstructor: ƒ Object()__defineGetter__: ƒ __defineGetter__()__defineSetter__: ƒ __defineSetter__()hasOwnProperty: ƒ hasOwnProperty()__lookupGetter__: ƒ __lookupGetter__()__lookupSetter__: ƒ __lookupSetter__()isPrototypeOf: ƒ isPrototypeOf()propertyIsEnumerable: ƒ propertyIsEnumerable()toString: ƒ toString()valueOf: ƒ valueOf()toLocaleString: ƒ toLocaleString()get __proto__: ƒ __proto__()set __proto__: ƒ __proto__()
</script>