JS对象分类

183 阅读3分钟

1、函数是对象,数组也是对象

2、什么是构造函数

  • 构造函数就是能够构造出对象的函数
  • 构造函数需要new 运算符一起使用
  • new X() 自动做了四件事
    1. 自动创建空对象
    2. 自动为空对象关联原型,原型地址指定为X.prototype
    3. 自动将空对象作为this关键字运行构造函数
    4. 自动return this
  • 构造函数
    1. X函数本身负责给对象本身添加属性
    2. X.prototype 对象负责保存对象的公用属性

3、代码规范

  • 大小写

    1. 所有构造函数(专门用于创建对象的函数),首字母大写
    2. 所有被构造出来的对象,首字母小写
  • 词性

    1. new 后面的构造函数名,使用名词形式,如,new Person(),new Object()
    2. 其他一般函数,一般用动词开头,如,createSquare(5),createElement('div')

4、关于原型

  • .prototypex.__proto__ 中,存的都是原型的地址,不是原型本身,地址的那一坨内存是原型
  • 共有属性的集合 就是原型

5、JS中最重要的公式:(用于确定一个对象的原型)

  • 为什么?
    1. let obj = new Object()的原型是Object.prototype
    2. let arr = new Array()的原型是Array.prototype
    3. let square = new Square()的原型是Square.prototype
    4. let fn = new Function()的原型是Function.prototype
  • 结论:你是谁构造的,你的原型就是谁的prototype属性对应的对象
  • 原型公式:对象.__proto__ === 其构造函数.prototype

6、典型问题

  • let x = {}
  • 请问:
    1. x的原型是什么?
    2. x.__proto__ 的值是什么?
    3. 上面两个问题是等价的吗?
  1. x的原型是Object.prototype 对应地址的对象
  2. x.__proto__Object.prototype 对应地址的对象
  3. 上面两个问题是等价的
  • 请问:
    1. Object.prototype是哪个函数构造出来的?
    2. Object.prototype的原型是什么?
    3. Object.prototype.__proto__?
  1. 无父无母,天生就有
  2. Object.prototype 没有原型
  3. Object.prototype.__proto__ === null
  • 注意:Object 的原型是指 Object.__proto__,不是 Object.prototype,因为 Object.prototye 是 Object 构造出来的对象的原型
 Object.__proto__ === Function.prototype  //true

7、对象需要分类的理由

  • 理由一:
    1. 有很多对象拥有一样的属性和行为
    2. 需要把它们分为同一类
    3. 如square1和square2
    4. 这样创建类似对象的时候就会很方便
  • 理由二:
    1. 但还是有很多对象拥有其他属性和行为
    2. 所以需要不同的分类,如Square/ Circle / Rect 就是不同的分类
    3. Array / Function 也是不同的分类
    4. 而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)

声明:该内容来自于饥人谷学习内容,不允许转载