面向对象
构造函数的使用
- 构造函数和普通函数没有区别, 只不过在调用的时候 和 new 关键字连用
- 书写构造函数, 函数名首字母大写, 当看到名字的时候,就知道要和 new关键字连用
- 调用的时候,需要和 new 关键字连用
- 只有和 new关键字连用的时候,这个函数才会自动创建和返回对象的能力
- 我们之所以书写构造函数,就是为了使用它去批量生产对象
- 如果不和 new 关键字连用,那么该函数没有创建对象的能力,没有自动返回对象的能力
- 调用构造函数的时候,如果不需要传递参数,
- 可以不写最后的小括号
- 如果你需要传递参数,那么必须写小口号
- 但是书写规范,我们都写上小括号
- 当你的函数名和 new 关键字连用的时候
- 函数内部的 this 只想 当前实例(new 关键字前面的变量)
- 我们直接在函数体内书写 this.xxx = 值
- 构造函数内部不要写 retur
- 当你 return 了一个基本数据类型的时候,写了白写
- 当你 return 了一个复杂数据类型的时候,构造函数写了白写
<script>
function Persion(){
this.name = "aaaa"
return "11111" // return无效
}
function Persion1(){
this.name = "aaaa" // 构造函数无效
return [1, 2, 3]
}
</script>
构造函数的不合理
- 当你在构造函数体内书写方法的时候,你需要想对象上添加方法的时候,只要创建一次对象(new xxx)就会有一个函数占用空间,创建100次就会有 100个一摸一样的函数出现,但这里面有99个是重复的
原型prototype
- 定义:每一个函数天生自带一个属性,叫做 prototype,是一个对象
- 构造函数也是函数,也会有这个自带的空间 prototype
- 既然 prototype是一个对象,我们就可以使用对象操作的语法, 向里面添加一些内容
定义: 每一个对象,在访问他的成员的时候,如果自己没有这个属性,会自动去所属构造函数的 prototype上查找
/*
1. 实例对象上的 __proto__指向谁?
指向所属构造函数的 prototype
p1所属的构造函数时 Person
p1.__proto__指向 Person.prototype
2. Person.prototype 的__proto__ 指向谁?
Person.prototype 所属的构造函数是谁?
Person.prototype 时一个对象数据类型(Object)
在 JS 内所有的 object 数据类型都时属于 object 这个内饰构造函数的
Person.prototype 时属于 Object 这个内置构造函数的
Person.prototype 的 __proto__ 指向 object.prototype
3. Person 的 __proto__指向谁?
Person 是一个函数,函数本身也是一个对象,就会有 __proto__
在 js 内, 所有的函数都是属于内置构造函数 Function的实例
Person.__proto__指向 Function.prototype
4. Object.prototype 的 __proto__ 指向谁?
Object.prototype 事一个对象树类型, 只要事对象, 都是数据 object 这个内置构造函数的
# 注意: Object.prototype 在 JS 内叫做顶级原型,不存在 __prototype__ 了
所以 Object.prototype 的 __proto__指向 null
5. Object的__proto__指向谁?
Object 是一个内置构造函数,同事也是一个函数, 同时也是一个对象
在 JS 内, 所有的 函数都是属于内置构造函数 Function的实例
Object 也是 Function的实例
Object.__proto__指向Function.prototype
6.Function.prototype 的 __proto__指向谁?
Function.prototype 也是夜歌对象数据类型
只要是对象数据类型都是 Object的实例
Function.prototype 的 __proto__指向 object.prototype
7. Function 的__proto__指向谁?
Function 也是一个内置构造函数, 也是一个函数
在 JS 内, 所有的函数都是属于内置构造函数 Function的实例
Function 自己是自己的构造函数
Function 自己是自己的实例对象
Function 所属的构造函数的时 Function
原型链
用 __proto__ 出啊年起来的对象链状结构
注意: 使用 __proto__
每一个对象数据类型, 都有一个属于自己的原型链
作用: 为了访问对象成员
对象访问机制:
当你需要访问兑现的成员的时候
首先在自己身上查找, 如果有直接使用
如果没有, 会自动去 __proto__ 上查找
如果还没有, 就再去 __proto__ 上查找
知道 object.prototype 都没有,那么返回 undefined
*/
function Persion(){}
Persion.prototype.a = 100
Persion.prototype.b = 200
var p1 = new Persion()
console.log(p.__prto__ === Persion.prototype)
当你访问 p的 a成员的时候,自己没有,会走动去自己的__proto__上查找,又因为自己的 __proto__就是Person.prototype,所以,其实就是去到Person.prototype上查找
自定义构造函数创建的对象也是对象,当你访问某一个成员的时候,如果没有,也会自动去所属构造函数的原型上查找
哪一个构造函数创建的对象,这个对象就属于哪一个构造函数
因为构造函数在创建对象的过程,我们起名未 实例化的过程,创建出来的对象叫做这个函数的一个实例化对象