JS 对象分类

136 阅读2分钟

new操作符

new X() 自动做了四件事情

  1. 自动创建空对象
  2. 自动为空对象关联原型,原型地址指定为 X.prototype
  3. 自动将空对象作为 this 关键字运行构造函数
  4. 自动 return this

——这就是 JS 之父的爱

构造函数 X

  • X 函数本身负责给对象本身添加属性
  • X.prototype 对象负责保存对象的共用属性

做一个小程序宽度来回变换并输出正方形的周长面积

let squareList = []
let widthList = [5,6,5,6,5,6,5,6,5,6,5,6]
function Square(width){ 
  this.width = width
}
Square.prototype.getArea = function(){ 
  return this.width * this.width 
}
Square.prototype.getLength = function(){
  return this.width * 4
}
for(let i = 0; i<12; i++){
  squareList[i] = new Square(widthList[i])
  console.log(squareList[i].constructor)
}

做一个小程序输出圆形的周长面积

a499ede132cd454bcf69f55491358d5.png

狗狗示例

1400a4b78c5721ec88a763f49f864c7.png

代码规范

大小写

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

词性

  • new 后面的函数,使用名词形式
  • 如 new Person()、new Object()
  • 其他函数,一般使用动词开头**
  • 如 createSquare(5)、createElement('div')
  • 其他规则以后再说**

一个重要的公式也是 JS 里唯一的一个公式

原型公式:

对象.proto === 其构造函数.prototype

结论:

你是谁构造的你的原型就是谁的prototype 属性对应的对象

参考资料

proto 和 prototype 存在的意义是什么--方应航

对象需要分类吗

需要分类

理由一

  • 有很多对象拥有一样的属性和行为
  • 需要把它们分为同一类
  • 如 square1 和 square2
  • 这样创建类似对象的时候就很方便

理由二

  • 但是还有很多对象拥有其他的属性和行为
  • 所以就需要不同的分类
  • 比如 Square / Circle / Rect 就是不同的分类
  • Array / Function 也是不同的分类
  • 而 Object 创建出来的对象,是最没有特点的对象

类型 V.S. 类

类型

  • 类型是 JS 数据的分类,有 7 种
  • 四基两空一对象

  • 类是针对于对象的分类,有无数种
  • 常见的有 Array、Function、Date、RegExp 等

数组对象

定义一个数组

  • let arr = [1,2,3]
  • let arr = new Array(1,2,3) // 元素为 1,2,3
  • let arr = new Array(3) // 长度为 3

a0e6ca7fb7fedc8e78ba06bdd0dc0dc.png

数组对象的自身属性

  • '0' / '1' / '2' / 'length'
  • 注意,属性名没有数字,只有字符串 3a1689dc1ba51bdd4ada4c0fc8a5597.png

数组对象的共用属性

  • 'push'
  • 'pop'
  • 'shift'
  • 'unshift'
  • 'join'

cb472665e4e0a50aede265ea0fc33e7.png

  • 其实就是英语小课堂啦,用法都在 MDN
  • 后面会有单独课程教这些 API

函数对象

定义一个函数

  • 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'

后面会有单独课程介绍函数

JS 终极一问

window 是Window构造的

可以通过 constructor 属性看出构造者

window.Object 是window.Function构造的

window.Function因为所有函数都是 window.Function 构造的

window.Function 是window.Function构造的

因为所有函数都是 window.Function 构造的 自己构造的自己?并不是这样,这是「上帝」的安排 浏览器构造了 Function,然后指定它的构造者是自己

ES 6 引入了新语法

class 统治天下

新手建议 这么多新语法怎么学

两种学法

  • 花一大块时间把 MDN class 文档全部看完,并记下来
  • 看到方方用什么,就学一点,课程学完,就都学会了
  • 推荐第二种学法,因为新语法实在太多了
  • 在实践中学,记得更牢

到底有多少新语法

  • 我已经整理了 ES6 的所有新语法,点击查看
  • 关于类和对象的新语法有页面1,页面2和页面3
  • 所以前端学得越早,越轻松

用 class 重写 Circle

6173d5718c6f4b1c36e477b52bdb5dc.png