原型 原型链

走远了吗. 提交于 2020-03-09 09:32:19

一、构造函数和原型

创建对象可以通过以下三种方式:
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在执行时会做四件事:

  1. 在内存中创建一个新的空对象
  2. 让this指向这个新的对象
  3. 执行构造函数里面的代码,给这个新对象添加属性和方法
  4. 返回这个新对象(所以构造函数里面不需要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指向的都是实例对象

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!