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是对象自身的一个属性
         
原文地址:https://www.cnblogs.com/zhuanzhibukaixin/p/6849017.html