# JS原型、原型链
为什么需要对象分类?
- 类型是对 JS 中数据的分类 JS 中的类型有:数字、字符串、布尔、符号Symbol、null、undefined、对象
- 类是对 JS 中对象的分类 JS 中的类有:数组 Array、函数 Function 、Date、RegExp等
# new操作符
创建new X()时做了什么?
- 自动创建空对象
- 自动将空对象关联原型,原型地址指定为
X.prototype
(即将X.prototype
保存的地址复制到空对象.__proto__
里) - 自动将空对象作为
this
关键字运行构造函数 - 自动
return this
构造函数X
- X函数本身负责给对象本身添加属性
X.prototype
对象负责保存对象的共用属性
# JS 构造对象方式
# 代码规范
- 大小写 所有构造函数(专门用于创建对象的函数)首字母大写 所有被构造出来的对象,首字母小写
- 词性
new后面的函数,使用名词形式(
new Person()
、new Object()
) 其他函数,一般使用动词开头(createSquare()
、createElement('div')
)
# 方式一:用 class
Example:
class Square{
static x = 1
width = 0
constructor(width){
this.width = width
}
getArea(){
return this.width * this.width
}
get length(){ //只读属性
return this.width * 4
}
}
let square = new Square(5)
square.width
square.getArea()
square.length()
# 方式二:用构造函数+prototype
自己定义构造函数Rect,函数里给this加属性 Rect自动创建prototype属性和对应的对象 #207 在Person.prototype #207 上面加属性 用new Rect() 创建对象 react new会将Rect的原型 __p设为 #207
function Rect(width, height){
this.width = width
this.height = height
}
Rect.prototype.getArea = function(){
return this.width * this.height
}
Rect.prototype.getLength = function(){
return (this.width + this.height) * 2
}
let react = new Rect(4,5)
rect.width
rect.height
rect.getArea()
rect.getLength()
# 原型
let obj = new Object() //原型 Object.prototype
let arr =new Array() //原型 Array.prototype
let square = new Squrae() //原型 Square.prototype
let fn = new Function() //原型 Function.prototype
# 对象.proto === 其构造函数.prototype
Test1:
let x = {}
x的原型是什么x.__proto__ = Object.prototype
Test2:
Object.prototype
的构造函数: 无
Object.prototype
的原型:null
Object.prototype.__proto__
的原型 :null
Test3: window是谁构造的?
Window()
window.Object是谁构造的?window.Function
window.Function是谁构造的?window.Function
Test4:多选题
# JS公式:
# 根公理:
# 函数公理:
Test