JavaScript原型链,javascript原型和原型链特点

  JavaScript原型链,javascript原型和原型链特点

  本教程运行环境:windows7系统,javascript1.8.5版本1.8.5,戴尔G3电脑。

  新运营商到底做了什么?其实很简单。我做了三件事。

  var obj={ };

  obj。_ _ proto _ _=Base.prototype

  base . call(obj);在第一行中,我们创建了一个空对象obj。

  在第二行中,我们将这个空对象的__proto__成员指向基本函数对象的原型成员对象。

  在第三行中,我们用obj替换了基函数对象的这个指针,然后调用基函数,所以我们给obj对象赋了一个id成员变量。这个成员变量的值是“base”,关于调用函数的用法。

  在讲原型链之前,我们首先要明白自定义函数和函数之间的关系是什么,构造函数、原型和实例之间的无数关系是什么?其实所有的函数都是函数的实例。构造函数上有一个prototype属性prototype,也是对象;然后原型对象上有一个构造函数属性,指向构造函数;实例对象上有一个_proto_ attribute,也指向原型对象,而且这个属性不是标准属性,所以在编程中不能使用。此属性供浏览器内部使用。

  //_proto_

  函数中有一个属性原型。

  默认情况下,由该函数创建的对象连接到该属性。

  //prototype和_ prototype的关系_

  _proto_是从对象的角度。

  原型是从构造者的角度。我们看图说话吧。

  1、构造函数、原型和实例的关系

  对象

  功能对象数组

  了解了这些之后,我们再来讨论什么是原型链。说白了,其实就是有限实例对象和原型之间的有限链,用来实现共享属性和继承。接下来,我们来谈谈代码。

  var obj=new Object();

  对象有原型对象。

  原型对象也有原型对象。

  obj。_proto_。_proto_。_proto_

  原型对象也有原型对象。如果你继续向上看,你会发现一个空值。

  //原型链示例

  var arr=[];

  数组.原型-对象.原型-空

  var o=new Object();

  o-object . prototype-null;函数Foo1(){

  this.name1= 1

  }

  函数Foo2(){

  this.name2= 2

  }

  foo 2 . prototype=new foo 1();

  函数Foo3(){

  this.name= 3

  }

  foo 3 . prototype=new foo 2();

  var foo 3=new foo 3();

  console . dir(foo 3);

  然后就是继承的问题。

  

2、继承

  

1)原型继承

  功能动物(名称){

  this.name=name

  }

  功能虎(彩色){

  this.color=color

  }

  //var tiger=新老虎(黄);

  //console . log(tiger . color);

  //console . log(tiger . name);//未定义

  //Tiger.prototype=新动物(老虎);//一种方式

  Object.prototype.name=大老虎;//第二种方式

  var tiger=新老虎(黄);

  console . log(tiger . color);

  console . log(tiger . name);这里值得注意的主要有两个问题:给父类型传递参数不方便;父类型中的引用类型由所有实例共享。

  2)ES5提供Object.create()方法实现继承。

  兼容性3354——

  //垫片垫圈

  函数创建(对象){

  if(Object.create){

  返回object . create(obj);

  }否则{

  函数Foo(){}

  Foo.prototype=obj

  返回新的Foo();

  }

  }这个方法是ES5的新特性,其实就是拷贝继承。

  3)复制继承

  var obj={ };

  obj.extend=function(obj){

  for(对象中的变量k){

  this[k]=obj[k];

  }

  } 4)借用构造函数继承

  3354借用的构造函数中原型的成员不是借用的

  功能动物(名称){

  this.name=name

  }

  功能鼠标(昵称){

  Animal.call(this, mouse );

  this.nickname=昵称;

  }

  var=new mouse( Jerry );

  console . log(m . name);

  控制台. log(m . nickname);存在的问题:原型继承中传递参数的问题可以解决,但是不能继承到父类型中原型对象上的成员(属性和方法)。

  5)组合遗传

  ——协议类型对象是动态的。

  功能人(姓名){

  this.name=name

  }

  person . prototype . showname=function(){

  console . log(this . name);

  }

  函数学生(姓名,年龄){

  Person.call(这个,名字);

  this.age=年龄;

  }

  Student.prototype=新人();

  Student.prototype.contructor=Student学生;

  student . prototype . showage=function(){

  console . log(this . age);

  }

  Var=新生(张三,12);

  stu . showname();

  stu . showage();【原型继承借用构造函数继承】其特点是属性的每个实例都有一个副本,方法是共享的。

  【概要】套用一句很粗鲁的话,所谓原型链,是一种寻找母亲的方式,所以你可以理解为,人是母亲生的,魔是母亲生的。链条的核心其实只有一个:属性共享和独立控制。当您的对象实例需要独立的属性时,所有实践的本质都是在对象实例中创建属性。如果不考虑太多,可以直接亲自定义需要的独立属性来覆盖原型的属性。总之,在使用原型继承时,要特别注意原型中的属性,因为它们都是相关的。现在最常用的方法是组合模式。

  1.原型链

  1)构造函数、原型和实例之间的关系

  构造函数有一个属性原型,是一个对象(Object的实例)。

  原型对象prototype中有一个构造函数属性,指向原型对象所属的构造函数。

  每个实例对象都有一个_proto_ attribute,同样指向构造函数的原型对象。它是非标准属性,不能用于编程,是浏览器自己使用的。

  2)原型和_proto_之间的关系

  原型是构造者的财产。

  _proto_是实例对象的属性。

  它们都指向同一个对象

  【概要】I)函数也是对象,对象不一定是函数;

  Ii)对象的本质:一组无序的键值对;键值对中的值可以是任何数据类型。

  Iii)对象是放置(属性和方法)的容器。

  3)属性搜索

  (1)当你访问一个对象的成员时,你会先在对象中寻找它的存在。

  如果当前对象中没有,则在构造函数的prototype对象中查找。

  如果在prototype对象中没有找到,就在prototype对象的原型中寻找。

  知道对象的原型为空。

  2、功能

  所有的函数都是函数的实例

  本地对象:3354独立于宿主环境(浏览器)的对象包括对象、数组、日期、正则表达式、函数、错误、数字、字符串、布尔。

  内置对象——包括Math和Global(window,是js中的全局变量),使用时不需要new。

  主机对象——包括自定义对象、DOM和BOM。

  【推荐学习:javascript高级教程】以上是如何理解javascript原型链的细节。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: