js 面向对象相关知识

来源:互联网 发布:xcode c语言编程教程 编辑:程序博客网 时间:2024/05/29 09:49
属性类型
   数据属性   访问器属性


   数据属性的4个特性
    1. configurable :表示能否删除属性,能否修改属性特性,或者能否改为访问器属性
2. enumerable: 表示能否通过for-in循环返回属性
3. writable: 表示能否修改属性的值 
4. value:包含属性的数据值
注意:直接在对象上定义属性,前三个特性都为true
      用Object.defineProperty()创建的属性,前三个特性为false


   访问器属性的4个特性
      1. configurable表示能否删除属性,能否修改属性特性,或者能否改为数据属性
2. enumerable表示能否通过for-in循环返回属性
3.  get :在读取属性是调用的函数 默认值为undefined
4.  set :在写入属性是调用的函数 默认值为undefined
  方法:
  1.Object.defineProperty() :修改属性默认的特性,接受3个参数 :对象名、属性名、描述符对象
 2.Object.getOwnPropertyDescriptor() :访问属性的特性 ,接受2个参数:对象、属性;
       
创建对象:
对象的组成
 属性:变量 ,状态 静态的 (属于某个对象的变量叫属性)
 方法:函数 ,过程 动态的 (属于某个对象的函数叫方法)
一、工厂模式:在函数内部显示的创建对象,并将属性和方法赋值给它,然后返回它。
   
二、构造函数模式  
   1.没有显示的创建对象
   2.直接将属性和方法赋值给this对象 ;(属性和方法属于谁就是谁,函数前面有new则失效)
   3.没有return语句
   4. 调用方法:
         当作构造函数来调用(构造函数首字母大写)
         作为普通函数调用(添加到window)
         在另一个对象的作用域中调用 :call()或 apply()
   5.缺点:使用构造函数,每个方法都要在每个实例上重新创建一遍
   6.实例的constructor(构造函数属性)指向构造函数:person1.constructor==Person
   7.创建的实例对象,既是Object的实例,又是构造函数的实例


三.原型模式
注意: 1创建的每个函数都有一个prototype属性,指向它的原型对象
    2 Person.prototype 指向原型对象  ,Person.prototype.constructor 指向Person
    3原型对象只会默认取得constructor属性,其他的属性和方法都是从Object继承
    4 创建一个实例,内部包含一个指针[[Prototype]],指向原型对象
    5可以通过对象实例访问constructor属性
6在实例中创建的属性会屏蔽原型中的属性(优先级)
    7. delete 删除实例属性,恢复对原型属性的链接
    8. 搜索顺序:先在实例中搜索,实例中有所需属性,则停止搜索,否则搜索原型


 方法:
  1. isPrototypeOf();判断原型对象
     Person.prototype.isPrototypeOf(person1);


  2. Object.getPrototypeOf();取得原型的值
      Object.getPrototypeOf(person1.name);


  3.hasOwnProperty();检测属性存在于实例中还是原型中,实例中则返回true
     person1. hasOwnProperty(‘name’);


  4. Object.getOwnPropertyDescriptor() 
        取得实例属性描述符
        var descriptor=Object.getOwnPropertyDescriptor(person1,"name");
   alert(descriptor.value); //
        取得原型属性描述符
Object.getOwnPropertyDescriptor(Person.prototype,”name”);


      5.Object.keys();返回可枚举属性的字符串数组
         var keys=Object.keys(person1);//实例中
         var keys=Object.keys(Person.prototype);//原型中


6. Object.getOwnProperty: 返回所有属性数组,包括constructor
    var keys=Object.keys(person1);//实例中
    alert(keys);
    var keys=Object.getOwnPropertyNames(person1);//原型中
 alert(keys);


7.  in 操作符:单独使用,在for-in循环使用
    单独使用:
      无论属性存在于实例中还是原型中
      alert(‘name’ in person1);//true


    在for-in循环使用 :(可以用前面两个方法来代替)
        返回所有能通过对象访问的、可枚举的属性,无论实例中还是原型中的属性






   8.原型的动态性
      1. 对原型对象做出的修改可以立即从实例中反映出来
      2. 重写原型对象则不行,实例的指针指向原型,而不是构造函数
  9 .原生引用类型的原型:
       如:Object  Array  String等 都在其构造函数的原型上定义了方法
       Array.prototype.sort();
       也可以定义新方法
   10.原型对象的问题
       对于包含引用类型值的原型属性,会被所有实例共享
   11.组合使用构造函数和原型模式 
     构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性      

继承
  一、原型链:利用原型让一个引用类型继承另一个引用类型的属性和方法
          实现:让原型对象等于另一个类型的实例,重写原型对象,代之以一个新类型的实例
                 SubType.prototype=new SuperType();
          结果:新原型中有新实例所拥有的全部属性和方法,其内部还有一个指针
                指向SuperType的原型
          搜索步骤:(1)实例,(2)SubType.prototype,(3)SuperType.prototype


       1.默认的原型:
           Object:所有函数的默认原型都是Object的实例
                  默认原型的prototype指向Object
       2.确认原型和实例的关系:
           instanceof:  alert(instance instanceof Object);
           isPrototypeOf():  alert(Object.prototype.isPrototypeOf(instance));
       3.  定义方法:
(1)给原型添加方法,重写超类型中的方法,放在继承之后;
            (2)不能使用对象字面量创建原型方法,这样会重写原型链
       4.  原型链的问题: 
(1)包含引用类型值的原型属性会被所有实例共享;
            (2)在创建子类型的实例时,不能向超类型的构造函数中传递参数
二、借用构造函数(伪造对象,经典继承)
      使用call() 和 apply() 方法 ,在(将来)新创建的实例对象上执行构造函数
       function SubType(){
      SuperType.call(this);
  }
   三、组合继承(伪经典类型)
         1.使用原型链实现对原型属性和方法的继承,借用构造函数来实现对实例属性的继承
     2. instanceof   isPrototypeOf()  识别基于组合继承创建的对象
原创粉丝点击