一、JS 重要公式
- 原型公式
对象.__proto__ === 其构造函数.prototype
let x = {}
x 的原型是什么?等价于 x.__proto__ 的值是什么?
答案: x.__proto__ === Object.protptype({}对象 = new Object)
Object.prototype 是哪个函数构造出来的? 不知道
等于Object.prototype 的原型是什么?没有原型
Object.prototype.__proto__? null
new X()自动做了四件事情
- 自动创建空对象
- 自动为空对象关联原型,原型地址指定为
X.prototype - 自动将空对象作为
this关键字运行构造函数 - 自动
return this
- 构造函数 X
- X 函数本身负责给对象本身添加属性
X.prototype对象负责保存对象的共用属性
代码规范
- 大小写
- 所有构造函数(专门用于创建对象的函数)首字母大写
- 所有被构造出来的对象,首字母小写
- 词性
- new 后面的函数,使用名词形式,如 new Person()、new Object()
- 其他函数,一般使用动词开头,如 createSquare(5)、createElement('div')
二、对象分类
- 分类理由一
- 有很多对象拥有一样的属性和行为
- 需要把它们分为同一类,如 square1 和 square2
- 这样创建类似对象的时候就很方便
- 分类理由二
- 但是还有很多对象拥有其他的属性和行为
- 所以就需要不同的分类
- 比如 Square / Circle / Rect 就是不同的分类,Array / Function 也是不同的分类
- 而 Object 创建出来的对象,是最没有特点的对象
- 数组对象
- 定义一个数组
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'
- 函数对象
- 定义一个函数
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'
- window 是谁构造的
- Window,可以通过 constructor 属性看出构造者
- window.Object 是谁构造的
- window.Function,因为所有函数都是 window.Function 构造的
- 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.prototypeObject.__proto__是 Object 的原型,由于 Object 是函数,而所有函数的原型都是Function.prototype,所以Object.__proto__ === Function.prototypeObject.prototye不是 Object 的原型,Object.__proto__才是 Object 的原型(还记着之前答过「x.原型 等价于x.__proto__」吗,现在只不过是把 x 替换成 Object。很多人都搞不清楚Object.__proto__和Object.prototype哪一个才是 Object 的原型,其实只要记住公式就好办了)