javascript中的prototype

简介: 本文着重解析javascript类继承机制,让你从底层了解javascript是怎样实现“继承”这一概念的。                                                                 jimichan在javaeye博客发布,转载请说明。
本文着重解析javascript类继承机制,让你从底层了解javascript是怎样实现“继承”这一概念的。
                                                                jimichan在javaeye博客发布,转载请说明。
http://jimichan.javaeye.com/blog/119815
   目前 javascript的实现继承方式并不是通过“extend”关键字来实现的,而是通过 constructor function和prototype属性来实现继承。首先我们创建一个animal
js 代码
 
  1.   var animal function (){   //这就是constructor function 了  
  2.    this .name = 'pipi';    
  3.    this .age = 10;      
  4.    this .height = 0;      
  5. }      
  6.  //建立一个动物的实例     
  7.  var  a1 =   new  animal ();   

构造函数与其他普通函数区别在于,1.构造函数里有 this关键字,2.调用构造函数是使用的new关键字。通过new运算符调用构造函数 animal 后,系统就会返回一个对象,这个对象就相当于
js 代码
  1. var  a1 = { name:'pipi' ,age:10,height:0 }  
  2.   
  3. //或者   
  4. var  a1 =  new  Object();  
  5. a1.name='pipi';  
  6. a1.age = 10;  
  7. a1.height = 0; 
等同这样的方式来产生js对象。

到这里我们知道如何在js中定义一个类了,接下来我们展示如何写一个cat

js 代码
 
  1. var  cat =  function (){    
  2. this .play =  function (){     
  3.  alert('cat play')    
  4.  }    
  5.  }    
  6.  cat .prototype = new  animal ();    
  7.  //prototype 属性指向一个对象 
  8. var c1 = new cat();

到这里,cat就继承了 animal 对象,类cat的一个实例对象c1拥有属性name,age,height,和方法play了。
那么
prototype起到了一个什么样的作用呢?
prototype就好比一个指针,它指向一个object,这个object就称为子类对象的原型。当cat的对象被创建的时候,由于cat的构造函数拥有prototype属性,那么cat的实例就会间接指向这个原型对象了(说成间接的是因为每个object都有一个 constructor 属性指向它的构造函数 )。
那么问题来了,“当我们修改对象 c1 的name属性的时候,会不会修改它prototype的name属性值呢?”,答案是否定的。
接下来详细解析:
1.访问name属性: 首先当我们第一次访问c1.name的属性的时候,我们会得到值“pipi”,这个和我们预料中的一样。但是计算过程你未必知道。
它计算的过程是这样的:第一步:检查c1对象中是否有name属性,找到的话就返回值,没有就跳到第二步,显然没有找到,因为cat的构造函数中没有定义。第二步:当第一步没有找时,去间接访问
prototype对象所指向的object,如果在 prototype对象中 找到的name属性的话,就返回找到的属性值。如果还是没有找到的话,再去递归地寻找 prototype对象的 prototype对象(去找它的爷爷) ,一直到找到name属性或者没有 prototype对象为止。如果到最后还是没有找到name属性的话就返回undefined。

2.设定name属性:当我们设定c1对象的name属性时,及调用 c1.name= ' new name';  这个过程就简单多了。首先检查是否对象已有该属性,若已存在则修改当前值,若不存在则为该对象新增一个属性并设定当前值。值得一提的是,在设定值的过程中没有去访问
prototype属性。

为了加深理解,我们再看一个 read-write-read 的过程,第一次read的时候,由于自己的对象没有name属性,那么就会返回的原型对象的name属性的值。第二步,写入name的值,同样没发现本身对象有name属性,那么就在本身对象上新建一个name属性,然后赋值。第三步,再次读取name属性,由于在第二步中已经新建了name属性,此时就返回在第二步中设定的值。值得一提的是,在这三步中没有改变原型对象的值。

好了,到此详细分析了 javascript对象是如果实现继承的,其实和其他的面向对象语言不一样的是,javascript的继承机制是对象的原型继承而不是类型继承。

呵呵,欢迎看完,有不对的地方欢迎大家讨论!

相关文章
|
6月前
|
前端开发 JavaScript
【JavaScript原型链prototype详解】
在JavaScript中,每个对象都有一个原型(prototype)属性,它指向另一个对象。这个被指向的对象也有自己的原型,以此类推,最终形成了一个原型链。原型链的顶端是Object.prototype,它是所有对象的根原型。 当我们访问一个对象的属性时,如果该对象自身没有这个属性,JavaScript会沿着原型链向上查找,直到找到匹配的属性或者到达原型链的末端。
86 0
【JavaScript原型链prototype详解】
|
6月前
|
JavaScript 前端开发
CocosCreator 面试题(二)JavaScript中的prototype的理解
CocosCreator 面试题(二)JavaScript中的prototype的理解
154 0
|
1月前
|
JavaScript
JS原型对象prototype
JS原型对象prototype
|
4月前
|
JavaScript 前端开发
JavaScript基础知识:什么是原型链(Prototype Chain)?
JavaScript基础知识:什么是原型链(Prototype Chain)?
32 2
|
4月前
|
JavaScript 前端开发 Java
JavaScript难点:原型、原型链、继承、new、prototype和constructor
JavaScript 不像 Java、C++ 这种纯面向对象的语言,可以通过类实现继承,JavaScript中的继承是通过原型实现的,即使 ES6 中新增的 class 类也只是原型的语法糖而已
48 4
|
自然语言处理 JavaScript 前端开发
JavaScript:深入理解原型语言,洞察__proto__与prototype之间的区别
JavaScript:深入理解原型语言,洞察__proto__与prototype之间的区别
214 0
|
Web App开发 JavaScript 前端开发
原型(prototype) 和 原型链(__proto__) —— 别再为 JavaScript 的原型苦恼了
原型(prototype) 和 原型链(__proto__) —— 别再为 JavaScript 的原型苦恼了
79 0
|
JavaScript
JS中的prototype、__proto__与constructor
JS中的prototype、__proto__与constructor
44 0
JS中的prototype、__proto__与constructor
|
JavaScript 前端开发
JavaScript prototype(原型)
JavaScript prototype(原型)
68 0
JavaScript prototype(原型)
|
JavaScript
JS中的prototype、__proto__与constructor
JS中的prototype、__proto__与constructor
JS中的prototype、__proto__与constructor