JavaScript 原型 -- 原型链
自己总结的原型
1.构造函数存在的问题:
构造函数方法很好用,但是存在内存浪费的问题
2.构造函数原型 prototype
构造函数通过原型分配的函数是所有对象所共享的
JS中规定,每一个构造函数都有一个prototype属性,指向另一个对象,注意这个prototype就是一个对象,这个对象的所有的属性和方法,都会被构造函数所拥有
我们可以把那些不变的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法
function star (name,age){
this.name = uname;
this.age = age;
}
Star.prototype.sing = function(){
console.log('我会唱歌');
}
var ldh = new Star('刘德华',18)
var zxy = new Star('张学友',19)
console.log(ldh.sing === zxy.sing); //true
ldh.sing(); //我会唱歌
zxy.sing(); //我会唱歌
//一般情况下,我们公共属性定义到构造函数里面,公共的方法我们放在原型对象身上
问题?
1.原型是什么?
一个对象,我们也称为prototype为原型对象
2.原型的作用是什么?
共享方法
3.对象原型 ____proto
function star (name,age){
this.name = uname;
this.age = age;
}
Star.prototype.sing = function(){
console.log('我会唱歌');
}
var ldh = new Star('刘德华',18)
var zxy = new Star('张学友',19)
console.log(ldh.sing === zxy.sing); //true
ldh.sing(); //我会唱歌
console.log(ldh); //对象身上系统会自动添加一个__proto__,指向我们构造函数的原型对象prototype
console.log(ldh.__proto__ === Star.prototype); //true
//方法的查找规则: 首先先看ldh对象身上是否有sing方法,如果有,就执行这个对象上的sing
//如果没有sing这个方法,因为有__proto__的存在,就去构造函数原型对象prototype身上去查找sing这个方法
对象都会有一个属性__proto__
指向构造函数prototype原型对象,之所有我们对象可以使用构造函数prototype原型对象上面的属性和方法,因为是有__proto__
原型存在
__proto__
对象原型和原型对象prototype是等价的
4.constructor 构造函数
对象原型(__proto__
)和构造函数(prototype)原型对象里面有一个属性 constructor 属性,constructor我们称之为构造函数,因为它指回调函数本身
constructor 主要用于记录该对象引用与哪个构造函数,它可以让原型对象重新指向原来的构造函数
function Star (name,age){
this.name = uname;
this.age = age;
}
/*Star.prototype.sing = function(){
console.log('我会唱歌');
};
Star.prototype.movie = function(){
console.log('我会演电影')
}*/
//很多情况下,我们需要手动的利用constructor 这个属性 指回 原来的构造函数
Star.prototype = {
//如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数
constructor : Star
sing:function(){
console.log('我会唱歌');
},
movie:function(){
console.log('我会演电影')
}
}
var ldh = new Star('刘德华',18)
var zxy = new Star('张学友',19)
console.log(Star.prototype); //Object
console.log(ldh.__proto__);
console.log(Star.prototype.constructor); //返回的是构造函数本身
console.log(ldh.__proto__.constructor);//返回的是构造函数本身
5.构造函数,实例,原型对象三者之间的关系
构造函数 与 原型对象 之间的关系
6.原型链
function star (name,age){
this.name = uname;
this.age = age;
}
Star.prototype.sing = function(){
console.log('我会唱歌');
}
var ldh = new Star('刘德华',18)
var zxy = new Star('张学友',19)
//1.只要是对象就有__proto__原型,指原型对象
console.log(Star.prototype) //里面也有一个 __proto__的属性
console.log(Star.prototype.__proto__ ===Object.prototype) //true
//2.我们Star原型对象里面的__proto__ 原型指向是Object.prototype
console.log(Object.prototype.__proto__); //null
7.JavaScript 的成员查找机制(规则)
- 当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性
- 如果没有找到就会查找他的原型(也就是
__proto__
指向的prototype原型对象) - 如果还没有就查找原型对象的原型(Object的原型对象)
- 以此类推一直找到Object为止(null)
__proto__
对象原型的意义就在于为对象成员查找机制提供一个方向,或者说是一条线路