zoukankan      html  css  js  c++  java
  • 关于对象+原型+继承(二)

    每个Javascript对象都包含着对一个原型对象的内部引用。原型对象的任何属性,都表现为每个以它为原型的方法的属性。也就是说,javascript对象可以从它的原型那里继承属性。

    prototype实现原理

    所有的对象都可以有prototype, prototype自己也是对象,那么他也可以有prototype,这样循环下去就形成了一个prototype链, 这个链当他遇到链中队形的prototype是null时中止。(Object的默认的prototype是null) 。

    1 var objectRef = new Object(); //create a generic javascript object.

    创建一个新的js对象,这时这个对象的prototype是Null,所以objectRef的prototype链只包含一个对象Object.prototype。
    我们再看下面的代码:

    复制代码
     1 /* 构建MyObject1这个类型的构造函数  MyObject1 - type.  
     2 */  
     3 function MyObject1(formalParameter){   
     4     /* 为者对象创建一个属性名字叫testNumber*/  
     5     this.testNumber = formalParameter;   
     6 }   
     7   
     8 /* 构建MyObject2这个类型的构造函数  MyObject2 - type:-*/  
     9 function MyObject2(formalParameter){   
    10    /* 为者对象创建一个属性名字叫testString*/  
    11     this.testString = formalParameter;   
    12 }   
    13   
    14 /* 下一步的操作会用MyObject1对象替换掉MyObject2默认的prototype属性*/  
    15 MyObject2.prototype = new MyObject1( 8 );   
    16   
    17 /* 最后我们创建MyObject2类型的一个对象*/   
    18 var objectRef = new MyObject2( "String_Value" );  
    复制代码

    objectRef这个MyObject2类型的对象有一个prototype的链,链中的第一个对象是MyObject1对象,MyObject1对象也有prototype, 这个prototype是Object默认的prototype,Object.prototype的prototype是null,至此这条prototype链结束。


    当一个取值操作发生时,objectRef 的整个prototype链就开始工作。

    1 var val = objectRef.testString;  

    objectRef这个对象的有一个属性叫做testString,那么这句代码会把testString的值赋给val。

    1 var val = objectRef.testNumber;

    在objectRef这个对象里并没有testNumber这个属性,但是val却的到了值8,而不是undefine,这是因为解释器在没有在当前对象找到要找 的属性后,就会去检查这个对象的prototype,objectRef的prototype是MyObject1对象,这个对象有testNumber这个属性,所以val得到8这个值。

    1 var val = objectRef.toString; 

    现在val是个function的引用,这个function是Object.prototype的property,由于MyObject1和MyObject2都没有定义toString这个property 所以Object.prototype返回。

    1 var val = objectRef.madeUpProperty;  

    最后val是undefined,因为MyObject1和MyObject2,还有Object都没有定义madeUpProperty这个property,所以得到的是undefine.

    读操作会读取在obj自己和prototype 链上发现的第一个同名属性值。
    写操作会为obj对象本身创建一个同名属性(如果这个属性名不存在。这就意味着objectRef.testNumber = 3会在objectRef对象上创建一个property,名字是testNumber,当下一次在要读取testNumber时propertype链就不会工作,仅仅会得到objectRef的property 3,而MyObject1的testNumber属性并不会被修改。

    判断对象原型的方法isPrototypeOf()

    如果isPrototypeOf()方法所属的对象是参数的原型对象,那么,该方法就返回true。否则返回false,例如:

    1 var o = {};
    2 Object.prototype.isPrototypeOf(o);    //true: o.constructor==Object;
    3 Object.isPrototypeOf(o);    //false
    4 o.isPrototypeOf(Object.prototype);    //false
    5 Function.prototype.isPrototypeOf(Object);    //true: Object.constructor == Function

    判断是否原型对象的继承属性

    Object.hasOwnProperty()方法用来区分继承的属性和对象的属性。

    本节链接至:http://www.baidu.com/link?url=urLhG4zmUyJ-w2xDK74xADY4Ab0kRN6E8Lu2wJXCAq3AB51fzNmEooJlGjYvahnFw9wpx573mgmXhxekb_zSfvzoQwDdXcGNkRLg7GHhf-q&wd=&eqid=ea8aa48b000026740000000656614780

    如有侵权请留言告知,本人立即删除。

  • 相关阅读:
    代理与反向代理
    Spring Batch 远程分区和远程分块的区别
    XWIKI部署安装
    想写一些与技术无关的
    1104报表
    ARQC与ARPC的生成和校验方法
    学习开源框架的一些总结
    linux java -version 和 javac -version 不一致
    spring boot 概念
    Unable to open socket file: target process not responding or HotSpot VM not loaded
  • 原文地址:https://www.cnblogs.com/pm-dongjian/p/5019950.html
Copyright © 2011-2022 走看看