1、函数是对象,数组也是对象
2、什么是构造函数
- 构造函数就是能够构造出对象的函数
- 构造函数需要new 运算符一起使用
- new X() 自动做了四件事
- 自动创建空对象
- 自动为空对象关联原型,原型地址指定为X.prototype
- 自动将空对象作为this关键字运行构造函数
- 自动return this
- 构造函数
- X函数本身负责给对象本身添加属性
- X.prototype 对象负责保存对象的公用属性
3、代码规范
-
大小写
- 所有构造函数(专门用于创建对象的函数),首字母大写
- 所有被构造出来的对象,首字母小写
-
词性
- new 后面的构造函数名,使用名词形式,如,new Person(),new Object()
- 其他一般函数,一般用动词开头,如,createSquare(5),createElement('div')
4、关于原型
.prototype和x.__proto__中,存的都是原型的地址,不是原型本身,地址的那一坨内存是原型- 共有属性的集合 就是原型
5、JS中最重要的公式:(用于确定一个对象的原型)
- 为什么?
- let obj = new Object()的原型是Object.prototype
- let arr = new Array()的原型是Array.prototype
- let square = new Square()的原型是Square.prototype
- let fn = new Function()的原型是Function.prototype
- 结论:你是谁构造的,你的原型就是谁的prototype属性对应的对象
- 原型公式:
对象.__proto__===其构造函数.prototype
6、典型问题
- let x = {}
- 请问:
- x的原型是什么?
x.__proto__的值是什么?- 上面两个问题是等价的吗?
- x的原型是
Object.prototype对应地址的对象 x.__proto__是Object.prototype对应地址的对象- 上面两个问题是等价的
- 请问:
Object.prototype是哪个函数构造出来的?Object.prototype的原型是什么?Object.prototype.__proto__?
- 无父无母,天生就有
- Object.prototype 没有原型
Object.prototype.__proto__ === null
- 注意:Object 的原型是指
Object.__proto__,不是Object.prototype,因为Object.prototye是 Object 构造出来的对象的原型
Object.__proto__ === Function.prototype //true
7、对象需要分类的理由
- 理由一:
- 有很多对象拥有一样的属性和行为
- 需要把它们分为同一类
- 如square1和square2
- 这样创建类似对象的时候就会很方便
- 理由二:
- 但还是有很多对象拥有其他属性和行为
- 所以需要不同的分类,如Square/ Circle / Rect 就是不同的分类
- Array / Function 也是不同的分类
- 而Object创建出来的对象,是最没有特点的对象
8、类型VS类
- 类型
- 类型是JS数据的分类,有7种:number,string,boolen,symbol,null, undefined,object
- 四基两空一对象
- 类
- 类是针对于对象的分类,有无数种
- 常见的有Array、Function、Date、RegExp 等等
9、JS终极疑问
- window是谁构造的
- Window
- 可以通过construstor属性看出构造者
- window.Object是谁构造的
- window.Function
- 因为所有函数都是window.Function构造的
- window.Function是谁构造的
- window.Function
- 因为所有函数都是window.Function构造的
- 浏览器构造了Function,然后指定它的构造者是自己

10、class语法(ES6引入的新语法)
class Square{
constructor(width){
this.width = width
}
getArea(){
return this.width*this.width
}
}
let s1 = new Square(3)
class语法对应原型的写法:
function Square(height,width){
this.height = height
this.width = width
}
Square.prototype.getArea = function(){
return this.height*this.width
}
Square.prototype.getLength = function(){
return this.width*2+this.height
}
let s1 = new Square(3)