JS 对象分类

108 阅读3分钟

一、JS 重要公式

  1. 原型公式
  • 对象.__proto__ === 其构造函数.prototype
let x = {}
 x 的原型是什么?等价于 x.__proto__ 的值是什么?
答案: x.__proto__ === Object.protptype({}对象 = new Object)
Object.prototype 是哪个函数构造出来的? 不知道
等于Object.prototype 的原型是什么?没有原型
Object.prototype.__proto__null 
  1. new X() 自动做了四件事情
  • 自动创建空对象
  • 自动为空对象关联原型,原型地址指定为X.prototype
  • 自动将空对象作为 this 关键字运行构造函数
  • 自动 return this
  1. 构造函数 X
  • X 函数本身负责给对象本身添加属性
  • X.prototype对象负责保存对象的共用属性

代码规范

  1. 大小写
  • 所有构造函数(专门用于创建对象的函数)首字母大写
  • 所有被构造出来的对象,首字母小写
  1. 词性
  • new 后面的函数,使用名词形式,如 new Person()、new Object()
  • 其他函数,一般使用动词开头,如 createSquare(5)、createElement('div')

二、对象分类

  1. 分类理由一
  • 有很多对象拥有一样的属性和行为
  • 需要把它们分为同一类,如 square1 和 square2
  • 这样创建类似对象的时候就很方便
  1. 分类理由二
  • 但是还有很多对象拥有其他的属性和行为
  • 所以就需要不同的分类
  • 比如 Square / Circle / Rect 就是不同的分类,Array / Function 也是不同的分类
  • 而 Object 创建出来的对象,是最没有特点的对象
  1. 数组对象
  • 定义一个数组
let arr = [1,2,3]
let arr = new Array(1,2,3) // 元素为 1,2,3
let arr = new Array(3) // 长度为 3
  • 数组对象的自身属性 '0' / '1' / '2' / 'length'注意,属性名没有数字,只有字符串
  • 数组对象的共用属性 'push' / 'pop' / 'shift' / 'unshift' / 'join'
  1. 函数对象
  • 定义一个函数
function fn(x,y){return x+y}
let fn2 = function fn(x,y){return x+y}
let fn = (x,y) => x+y
let fn = new Function('x','y', 'return x+y')
  • 函数对象自身属性 'name' / 'length'
  • 函数对象共用属性 'call' / 'apply' / 'bind'
  1. window 是谁构造的
  • Window,可以通过 constructor 属性看出构造者
  1. window.Object 是谁构造的
  • window.Function,因为所有函数都是 window.Function 构造的
  1. window.Function 是谁构造的
  • window.Function,因为所有函数都是 window.Function 构造的

三、易错易混点

1.关于 prototype 属性,正确的有:

  • 所有函数一出生就有一个 prototype 属性(除了箭头函数)
  • 所有 prototype 一出生就有一个 constructor 属性
  • 所有 constructor 属性一出生就保存了对应的函数的地址
  • 如果一个函数不是构造函数,它依然拥有 prototype 属性,只不过这个属性暂时没什么用
  • 如果一个对象不是函数,那么这个对象一般来说没有 prototype 属性,但这个对象一般一定会有 __proto__ 属性

2.关于 Object.prototype,正确的是(多选)

  • Object.prototye 是「Object 构造出来的对象 obj」的原型,即 obj.__proto__ === Object.prototype
  • Object.__proto__ 是 Object 的原型,由于 Object 是函数,而所有函数的原型都是 Function.prototype,所以 Object.__proto__ === Function.prototype
  • Object.prototye 不是 Object 的原型,Object.__proto__ 才是 Object 的原型(还记着之前答过「x.原型 等价于 x.__proto__」吗,现在只不过是把 x 替换成 Object。很多人都搞不清楚 Object.__proto__ Object.prototype 哪一个才是 Object 的原型,其实只要记住公式就好办了)