原型和原型链 prototype和proto的区别详情

  目录

  1、原型

  原型是对象下的属性,它定义了构造函数的共同祖先,也就是一个父子级的关系,子对象会继承父对象的方法和属性

  通过给原型添加属性,可以让所有的实例化对象共享属性和方法

  Car.prototype = {

  height : 1400,

  lang : 4900,

  carName : 'BMW'

  }

  function Car() {

  }

  var car = new Car();

  2、原型链

  每个实例对象下都有属性,通过属性指向构造函数的原型对象,当到达末端时,返回null,这样一层一层向顶端查找,就形成了原型链

  是函数特有的, 是对象有的,中万物皆对象

  和区别与作用

  __proto__对象原型的意义就在于为对象的查找机制提供一个方向,或者说一条路线,但是它是一个非标准属性,因此实际开发中,不可以使用这个属性,它只是内部指向原型对象 prototype

  2.1 constructor构造函数

  属性存在于和,它指向构造函数本身

  一般情况下,对象的方法都在构造函数的原型对象中设置。如果有多个对象的方法,我们可以给原型对象采取对象形式赋值,但是这样就会覆盖构造函数原型对象原来的内容,这样修改后的原型对象 constructor 就不再指向当前构造函数了。此时,我们可以在修改后的原型对象中,添加一个 constructor 指向原来的构造函数。

  问题 :修改了函数的原型对象,constructor的指向是谁

  function Star(uname, age) {

  this.uname = uname;

  this.age = age;

  }

  // 很多情况下,我们需要手动的利用constructor 这个属性指回 原来的构造函数

  Star.prototype = {

  // 如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数

  constructor: Star, // 手动设置指回原来的构造函数

  sing: function() {

  console.log('我会唱歌');

  },

  movie: function() {

  console.log('我会演电影');

  }

  }

  var zxy = new Star('张学友', 19);

  console.log(zxy)

  在修改函数原型时,因为就是一个对象,所以指向构造这个对象的原型,也就是

  2.2 call/apply

  通过可以改变的指向,借用别人的函数完成自己的功能

  区别:传多个参数 传一个参数数组

  function Person(name,age,sex) {

  this.name = name;

  this.age = age;

  this.sex = sex;

  }

  function Student(name,age,sex,tel,grade) {

  //var this = {name: "lin", age: "19", sex: "male", tel: 123, grade: 78}

  Person.call(this,name,age,sex);//通过call改变this的指向这个函数

  //Person.apply(this,[name,age,sex])

  this.tel = tel;

  this.grade = grade;

  }

  var student = new Student('lin','19','male',123,78);

  2.3 new()

  var obj = {}//创建空对象

  obj.__proto__ = Person.prototype;//继承作用域

  Person.call(obj,)//改变this指向

  //这三步是隐式的

  var person = new Person();//new操作

  到此这篇关于原型和原型链 prototype和proto的区别详情的文章就介绍到这了,更多相关原型和原型链 prototype和proto的区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

  您可能感兴趣的文章: