一、构造函数和原型
创建对象可以通过以下三种方式:
1、对象字面量
var obj2={ };
2、new Object()
var obj1=new Object();
3、自定义构造函数(对象有很多的公共属性和方法 抽取出来做一个模板 然后再大量的生产对象)
function Star(uname,age) {
this.uname=uname;
this.age=age;
this.sing=function(){
console.log("唱歌")
}
}
//利用构造函数创建对象
var ldh=new Star("刘德华",18);
var zxy=new Star("张学友",19);
console.log(ldh);
ldh.sing();
zxy.sing();
构造函数
是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与new一起使用,我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。
new在执行时会做四件事:
- 在内存中创建一个新的空对象
- 让this指向这个新的对象
- 执行构造函数里面的代码,给这个新对象添加属性和方法
- 返回这个新对象(所以构造函数里面不需要return)
二、原型
构造函数的问题:
构造函数会存在浪费内存的问题
function是复杂数据类型 会开辟一个新的内存空间储存
console.log(ldh.sing===zxy.sing);//false 比较的是地址
我们希望所有的对象使用同一个函数,这样就比较节省内存,就要用到构造函数原型对象prototype
构造函数通过原型分配的函数是所有对象所共享的
不用单独开辟内存空间了
javascript规定,每个构造函数都有一个prototype属性,指向另一个对象, prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有
我们可以把那些不变的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法
function Star(uname,age) {
this.uname=uname;
this.age=age;
//this.sing=function(){
// console.log("唱歌")
// }
}
Star.prototype.sing=function(){
console.log("唱歌");
}
var ldh=new Star("刘德华",18);
var zxy=new Star("张学友",19);
//console.log(ldh);
ldh.sing();//唱歌
zxy.sing();//唱歌
console.log(ldh.sing===zxy.sing);//true 指向同一个地址 方法共享
原型
的作用
就是:共享方法
一般情况下,我们的公共属性定义到构造函数里面,公共的方法我们放到原型对象身上
三、对象原型__proto__
对象都会有一个属性__proto__
指向构造函数的prototype原型对象,之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有__proto__原型的存在
console.log(ldh.__proto__===Star.prototype);//true
__proto__对象原型和原型对象prototype是等价的
方法的查找规则:
首先看ldh对象身上是否有sing方法 ,如果有就执行这个歌对象上的sing 如果没有sing这个方法 因为有__proto__的存在,就去构造函数原型对象prototype身上去查找sing这个方法
__ proto__对象原型的意义就在于为对象的查找机制提供了一个方向,或者说一条路线,但是它是一个非标准属性,所以不可以使用这个属性,他只是内部指向原型对象prototype
四、constructor 构造函数
对象原型(__ proto__)和构造函数(prototype)原型对象里面都有一个constructor属性,constructor称为构造函数,因为它指回构造函数本身
console.log(Star.prototype.constructor);
console.log(ldh.__ proto__.constructor);//返回构造函数本身
constructor的作用就是告诉我们这个对象是通过哪个构造函数创建出来的
如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动添加constructor来指回原来的构造函数
Star.prototype={
constructor:Star,
sing:function(){
console.log("唱歌");
},
movie:function(){
console.log("演电影");
}
}
构造函数、实例、原型对象三者之间的关系
五、原型链
我们Star原型对象里面的__ proto__原型指向的是Object.prototype
六、原型对象this指向
在构造函数中或者在原型对象函数里面的this指向的都是实例对象