构造函数
构造函数是给对象添加属性,初始化属性用的。
- 使用new关键字创建的对象,对象的类型就是创建这个对象使用的构造函数的函数名
- 使用{}创建对象,对象的类型一定是Object,相当于使用了new Object()使用构造函数为其初始化成员
- 在构造函数调用开始的时候,有一个赋值操作,也就是让this = 刚创建出来的对象
- 在构造函数中,this就代表刚创建出来的对象
注意:构造函数时,函数名必须大写
this指向实例化后的对象
原型
(1) 神秘对象与构造函数
- 神秘对象就是构造函数的 “原型属性”
- 简称原型 (构造函数的原型)
(2)神秘对象与构造函数所创建出来的对象
- 神秘对象针对构造函数创建出来的对象称为 “原型对象”
- 简称原型 (对象的原型)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<script type="text/javascript">
function Person(name,age){
this.mingzi=name;
this.nianling=age;
this.say=function(){
console.log('你好')
}
}
//设置添加对象并访问
Person.prototype.run=function(){
console.log('加油')
}
Person.prototype.job='软件开发'
var man=new Person('孙悟空',20)
console.log(man.mingzi); //孙悟空
console.log(man.say)
var wom=new Person()
console.log(wom.run)
console.log(wom.job) //软件开发
//在访问对象时,如果构造函数中没有访问到对象(函数也是对象), 则继续会向该函数的上一级访问(原型/神秘对象).
//所以我们给他的上一级设置添加对象,用【构造函数名 . propotype . 函数名的=function(){}】的方法访问原型
//因为有指向,所以就不用担心函数名的创建
</script>
</body>
</html>
既然所有对象共享神秘对象(构造函数.prototype)内的属性和方法。我们只需要将需要共享的东西,也就是重复占用内存的东西,全部都放到 神秘对象(构造函数.prototype)中。
原型替换
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
function Person(){}
Person.prototype.name='张三'
Person.prototype.age='30'
var person1=new Person
console.log(person1.name); //张三
person1.name='李四' //将李四赋值给 获取的对象(张三)
console.log(person1.name)//李四
var person2=new Person();//新实例化一个对象 重新通过构造函数构造对象,
console.log(person2.name);//张三
</script>
</body>
</html>
原型继承
- 构造函数创建的对象 继承自 构造函数的原型属性
- 构造函数创建的对象 继承自 该对象的原型对象
- 原型中的成员, 可以直接被实例对象所使用
- 实例对象直接 “含有” 原型中的成员
- 因此实例对象 继承自 原型
- 这样的继承就是 “原型继承”
关键点
每一个函数在定义的时候,都会有跟它关联的一个对象被创建出来
每一个由构造函数创建出来的对象,都会默认的和构造函数的神秘对象关联
当使用一个方法进行属性或者方法访问的时候,会先在当前对象内查找该属性和方法
如果当前对象内未找到,就回去跟它关联的神秘对象内进行查找
原型链结构
凡是对象就有原型, 原型又是对象, 因此凡是给定义一个对象, 那么就可以找到他的原型, 原型还有原型. 那么如此下去, 就构成一个对象的序列. 称该结构为原型链.
使用构造函数创建出对象, 并且没有利用赋值的方式修改原型, 就说该对象保留默认的原型链.
默认的原型链结构就是:当前对象 -> 构造函数.prototype -> Object.prototype -> null