zoukankan      html  css  js  c++  java
  • javascript的oop——>>> [__proto__ 与 prototype/原型链/原型属性与原型方法/for-in循环]

      前  言

     OOP 

     javascript的oop中的__proto__  与  prototype/原型链/原型属性与原型方法/for-in循环

    1  __proto__  与  prototype/原型链
       
          1、prototype(函数的原型):函数才有prototype。prototype是一个对象,指向了当前构造函数的引用地址呢。
             
                 2、__proto__(对象的原型对象):所有对象都要__proto__属性。当用构造函数实例化(new)一个对象时,会将新对象的__proto__属性,指上构造函数的prototype。
             
                 zhangsan.__proto__ == Person.prototype √
             
                 所有对象,最终都会指向Object()的prototype。
             
    2  原型链
       
      1、prototype(函数的原型):函数才有prototype。prototype是一个对象,指向了当前构造函数的引用地址呢。
             
                 2、__proto__(对象的原型对象):所有对象都要__proto__属性。当用构造函数实例化(new)一个对象时,会将新对象的__proto__属性,指上构造函数的prototype。
             
                 zhangsan.__proto__ == Person.prototype √
             
                 所有对象,最终都会指向Object()的prototype。
             
    3  原型属性与原型方法
       
         1、成员属性、成员方法:
                this.name = "";   this.func = function(){}
                 >>> 属于实例化出的对象的。通过"对象.属性"调用。
             
              2、静态属性、静态方法:
                Person.name = "";   Person.func = function(){}
                 >>> 属于类(构造函数)的。通过"类名.属性"调用。
             
              3、私有属性、私有方法:
                在构造函数中,使用 var num = 1; 声明。
                 >>> 只在构造函数内部能用,在外部无法通过任何方式访问;
             
              4、原型属性、原型方法:
                Person.prototype.name = "";
                Person.prototype.func = function(){};
                 >>> 写在了构造函数的prototype上。当使用构造函数实例化对象事,该属性方法会进入新对象的__proto__上。
             
                也就是说,1/4 使用对象可访问,2使用类名可访问,3只能在函数的{}内使用
             
              5、 习惯上,我们会将属性写为成员属性,而方法写为原型方法;
                例如: function Person(){
                             this.name = "zhangsan";
                          }
                      Person.prototype.say = function(){}
                原因:
                  ① 实例化出对象后,所有属性直接在对象上,所有方法都在__proto__上,非常直观清晰。
                  ② 方法写到prototype上,要更加节省内存;
                  ③ 使用for in 循环时,会将对象以及对象原型链上的所有属性和方法打印出来,而方法往往是不需要展示的。 将方法写到__proto__上,可以使用hasOwnProperty将原型上的方法过滤掉、不显示。
                  ④ 官方都这么写。
             
             
              6、 当访问对象的属性/方法时,会优先使用对象自有的属性方法。如果没有找到,便使用__proto__属性在原型上查找,如果找到即可使用。
                  但,当对象自身,以及__proto__上有同名方法,执行对象自身的。
             
              7、可以通过prototype扩展内置函数的相关方法;
                
             
    4  for-in循环
       
             for-in循环,主要用于遍历对象。
             
              for()中格式:  for(keys in obj){}
             
              keys表示obj对象的每一个键值对的键。所以{}中,使用obj[keys]读取每个值;
             
              但是,使用for-in循环,不但能遍历对象本身的属性和方法,还能够遍历对象原型链上的所有属性方法。
             
              可以使用hasOwnProperty判断一个属性,是否是对象自身的属性。
              obj.hasOwnProperty(keys)==true 表示:keys是对象自身的一个属性
             
  • 相关阅读:
    ECNU 3532 热河路
    ECNU 3531 定西
    前端-如何用gulp快速搭建项目(sass预编译,代码压缩,css前缀,浏览器自动刷新,雪碧图合成)
    CTF—攻防练习之Capture the Flag
    CTF—攻防练习之HTTP—PUT上传漏洞
    CTF—攻防练习之HTTP—SQl注入(get)
    CTF—攻防练习之FTP服务后门
    CTF—攻防练习之SMB私钥泄露
    CTF—攻防练习之ssh私钥泄露
    CTF—WEB—sql注入之无过滤有回显最简单注入
  • 原文地址:https://www.cnblogs.com/zhuanzhibukaixin/p/6849017.html
Copyright © 2011-2022 走看看