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是等价的

1692363076296.png

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.构造函数,实例,原型对象三者之间的关系

构造函数原型对象 之间的关系

1692364887662.png

1692365525339.png

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

1692367885432.png

7.JavaScript 的成员查找机制(规则)

  1. 当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性
  2. 如果没有找到就会查找他的原型(也就是__proto__指向的prototype原型对象)
  3. 如果还没有就查找原型对象的原型Object的原型对象
  4. 以此类推一直找到Object为止(null)
  5. __proto__ 对象原型的意义就在于为对象成员查找机制提供一个方向,或者说是一条线路
全部评论

相关推荐

offer多多的六边形战士很无语:看了你的博客,感觉挺不错的,可以把你的访问量和粉丝数在简历里提一下,闪光点(仅个人意见)
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务