+发表新主题
查看: 1534|回复: 0

[代码片段] js 原型和原型链

[复制链接]

[代码片段] js 原型和原型链

[复制链接]
风的传说自由 发表于 2016-1-6 20:02:06 浏览:  1534 回复:  0 [显示全部楼层] |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一. 原型和原型链

      原型(prototype):保存所有子对象共有成员的对象

             每个构造函数都有一个原型属性引用了该构造函数对应的原型对象


      由构造函数创建的每个对象中都有一个__proto__属性,指向构造函数的原型对象,在访问子对象的成员时,优先在成员本地找。找不到,再去构造函数的原型中查找。


         new1. 创建空对象

         2. 调用构造函数,为新对象添加成员

         3. 设置当前对象的__proto__属性为构造函数的原型对象

         4.将新对象的地址保存到obj变量中


例如:


  1. //原型

  2. function Student(sname,age){

  3.      this.sname=sname;

  4. this.age=age;

  5. }

  6. //为构造函数的原型对象 添加intrSelf函数

  7.    Student.prototype.intrSelf=function(){

  8. console.log("I'm "+this.sname+","+" I'm "+this.age);

  9.                };



  10.    var lilei=new Student("lilei",18);

  11.        var hmm=new Student("hmm",19);

  12. console.log(lilei.sname);

  13.        console.log(lilei.age);

  14. lilei.intrSelf();

  15. console.log(hmm.sname);

  16.        console.log(hmm.age);

  17. hmm.intrSelf();
复制代码
195309s6hvnv2vb6c6ckcf.png


       原型链:由各级对象的__proto__逐级向上引用形成的多级继承关系

          所有的对象都有一个__proto__属性,指向自己的父对象

             属性何时放在构造函数中:每个对象自有的

          属性何时放在原型对象中:所有子对象共有的


上面程序的原型链如下:

195309s6hvnv2vb6c6ckcf.png



.原型相关API

      1. 判断对象的属性是自有,还是共有:

         自有属性:保存在对象本地的属性

         共有属性:保存在公共原型对象中的属性


       如何判断一个属性是否可用:

         1. in关键字:"属性名" in 对象

                如果"属性名"在当前对象的原型链中,返回true

                如果在整条原型链上都没找到,返回false

例如:

      


  • //判上面代码中 lilei和hmm是否可用intrSelf函数
  •         console.log("intrSelf" in lilei);        console.log("intrSelf" in hmm);

复制代码
195309s6hvnv2vb6c6ckcf.png

         2. 使用===undefined:说明不包含!

            简写为(!对象.成员名)

例如:

      


  • console.log(lilei.intrSelf===undefined);       console.log(!hmm.intrSelf);

复制代码
195309s6hvnv2vb6c6ckcf.png


       专门判断是否自有属性:obj.hasOwnProperty("成员");

                     如果obj本地有指定"成员",则返回true,没有返回false

例如:

        


  • hmm.money=5;
  • console.log(hmm.hasOwnProperty("money")); //true        console.log(lilei.hasOwnProperty("money"));//false

复制代码
195309s6hvnv2vb6c6ckcf.png


       判断共有属性:不是自有的,还要存在于原型链上

                  if(!obj.hasOwnProperty("属性")&&"属性" in obj)


例如:

   


  • //判断共有属性
  • console.log(!(hmm.hasOwnProperty("intrSelf"))&&
  •                         ("intrSelf" in hmm));//true
  • console.log(!(hmm.hasOwnProperty("sname"))&&                        ("sname" in lilei));//false

复制代码
195309s6hvnv2vb6c6ckcf.png


    2. 获得任意对象的__proto__属性:获得父对象

         var 父对象=Object.getPrototypeOf(对象);

例如:

     


  • //获得lilei的对象
  • var father=Object.getPrototypeOf(lilei); console.log(father);

复制代码
195309s6hvnv2vb6c6ckcf.png

     


  • //判断hmm的父对象是否等于lilei的父对象
  • console.log(Object.getPrototypeOf(lilei)==            (Object.getPrototypeOf(hmm)));

复制代码
195309s6hvnv2vb6c6ckcf.png

    3. 判断父对象是否处在子对象原型链的上级:

         父对象.isPrototypeOf(子对象)

          只要父对象在子对象的原型链上,就返回true

                                 否则返回false

例如:

        


  • //判断Student的原型对象是否处于hmm对象的上级         console.log(Student.prototype.isPrototypeOf(hmm));

复制代码
195309s6hvnv2vb6c6ckcf.png


   4.删除对象中的属性:delete 对象.成员

             只能删除自有的成员

             只有var声明的全局变量不让delete

             使用window.window[""]增加的全局成员可以delete

例如:


  • //删除hmm.money属性
  •          hmm.money=5;
  • console.log(hmm.hasOwnProperty("money"));
  • delete hmm.money;        console.log(hmm.hasOwnProperty("money"));

复制代码
195309s6hvnv2vb6c6ckcf.png


//var 声明的变量不让删

195309s6hvnv2vb6c6ckcf.png

回复

使用道具 举报


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版| 赣南网

© 2013-2016 Comsenz Inc. Powered by Discuz! X3.4

用微信扫一扫

赣南网