zoukankan      html  css  js  c++  java
  • javascript对象

    1.定义:
      面向对象:在程序中都是用一个对象来描述现实中一个具体的东西
      3大特点:封装 继承 多态
      什么是对象:封装多个数据和方法的存储空间
    2.创建自定义对象(4种):
      1.对象直接量    

        var obj={
          "attbuteName":value,
          ...:...,
          "mothodName":function(){...this.attbuteName...}

      2.new Object();
        
    var obj=new Object();//创建一个空对象
        obj.attbuteName=value;
        obj.mothodName=function(){...this.attbuteName...};
      3.利用构造函数反复创建相同结构的对象(构造函数:描述一类对象结构的特殊函数)

    //定义构造函数 Student
    function Student(sname,age){
    this.name=name;
    this.age=age;
    this.intrSelf=intrSelf=function(){alert("I'm "+this.sanme+",I'm "+this.age);}
    }
    //利用构造函数创建对象:
    var liLei=new Student("Li Lei",12);
    var hmm=new Student("Han Meimei",11);

      4.Object.create(父对象,{扩展属性的列表对象}) 

      5.访问属性(2种方法): obj.属性名 obj["属性名"]

        (访问数组中不存在的下标):不会报错,放回undefined
        强行给不存在的属性赋值,不会报错,js会自动创建同名属性
      6.判断某个对象是否包含制定成员(3种):
        obj.hasOwnProperty("成员名")
        "属性名" in 对象
        直接使用 obj.对象名作为条件

     1 /*
     2         String类型提供了trim方法,但IE8没有
     3         判断当前浏览器的String类型是否包含trim方法
     4         如果不包含,自定义公共trim方法
     5     */
     6     if(!String.prototype.trim)
     7     {
     8         String.prototype.trim=function(){
     9             return this.replace(/^s|s$/g,"");
    10         }
    11     }
    12     var str="   Hello World !    ";
    13     document.write(str.trim());

    3.this
      如何在方法中,访问当前对象自己(使用this);
      this关键字:运行时,指代正在调用方法的对象(.当前对象)
      this本质是window下唯一一个指针,指向当前正在调用方法的对象
      在方法内访问当前对象自己的属性,必须使用this.属性名
      ***this和定义在哪无关!仅和调用时使用的当前对象有关
      ***如果无主的调用或赋值,默认this都是window

    /*this.*/a=100;
    //window.a=100;
    (function(){
        var a=99;
        console.log(this.a);  //window.a
    })(); //100
    //***如果无主的调用或赋值,默认this都是window
     1 /*鄙视题*/
     2     //this-->window
     3     var a=2;
     4     //this-->window
     5     function fun(){
     6         console.log(this.a);
     7     }
     8     //this-->window
     9     var o={a:3,fun:fun};//this-->o
    10     var p={a:4};//this-->p
    11     o.fun(); //this-->o    3
    12      console.log(o.a) //3
    13 
    14     (p.fun=o.fun)(); //2 == fun()
    15         /*赋值表达式的结果相当于等号右侧表达式*的值**/   

    4.继承
      js中一切继承都是用原型对象实现的
      原型对象:每个函数对象都有一个原型对象
      构造函数的原型对象负责保存所有子对象共享的成员
      建议:所有子对象共享的方法,都应该定义在构造函数的原型对象中。--避免重复定义方法对象,浪费内存
      说明:所有内置对象类型的API都定义在类型[type].prototype中

     1 //在构造函数原型对象中定义公共方法
     2 Student.prototype.intrSelf=function(){
     3     alert("I'm "+this.sname+",I'm "+this.age);
     4 }
     5 var lilei=new Student("Li Lei",12);
     6 var hmm=new Student("Han Meimei",11);
     7 //在构造函数原型对象中定义公共属性
     8 Student.prototype.money=100;
     9 console.log(lilei.money);
    10      //先在当前对象本地找
    11      //找不到再去查找原型链
    12     //原型链也没有,才返回undefined 
    13 console.log(hmm.money); 14 /* 定义在构造函数的原型对象中,避免了实例化重复定义方法,减少内存的占用 15 */
     1 //使用Object.create创建对象继承
     2 
     3 //父对象
     4 var father={car:"BMW",balance:100000000};
     5 //继承父对象
     6 var hmm=Object.create(father,
     7     {sing:{value:sing},//扩展方法
     8     sname:{value:"Han Meimei"},//扩展属性
     9     age:{value:18,writable:false},//扩展属性 不可写
    10     intrSelf:{value:intrSelf}//扩展方法
    11     }
    12 );
    13 //扩展方法
    14 function intrSelf(){
    15         alert("我是"+this.sname+",今年"+this.age);
    16     }
    17 function toString(){
    18     return "{sname:"+this.sname+", age:"+this.age+"}";
    19     }    

    js模拟Java中的继承(仅继承结构):

    function 子类型构造函数(属性参数1,属性参数2,属性参数3){
      父类型构造函数.call(this,属性参数1,属性参数2); //在子构造函数中强行调用父函数的构造函数,继承父构造函数中结构,但是无法继承父函数的原型结构(不再同一条原型链上)
      this.属性3=属性参数3;
    }

    5.扩展对象属性(2种):

      1.扩展共有属性:通过构造函数.prototype添加属性
      2.扩展自有属性:通过某一个具体子对象添加属性
      判断自有属性或公共属性:
        1.判断自有属性:obj.hasOwnProperty("属性名")
        2.判断共有属性:"属性名" in obj && !obj.hasOwnProperty("属性名") //在原型关系中包含且子对象自己没有
    6.删除属性 delete 对象.属性名 //仅能删除当前对象自己的属性,无法删除共有属性

    1 //全局变量3中
    2 var n=1;
    3 delete n;//不能删除  
    4 window.n=1;
    5 delete window.n;//不能删除
    6 var window["n"]=1;
    7 delete window.n;//可以删除

    7.原型链:由各级对象的__proto__逐级继承形成的关系

     1 //判断原型链
     2     var monkey={
     3         hair:true,
     4         feeds:"bananas"
     5     }
     6     function Human(name){
     7         this.name=name;
     8     }
     9 
    10     Human.prototype=monkey;
    11     var geoge=new Human("Geoge");
    12     console.log(monkey.isPrototypeOf(geoge));//true
    13     console.log(Object.prototype.isPrototypeOf(monkey));//true
     0 //判断array数组的类型
    1 document.write(typeof("Hello")+"<br>"); //string 2 document.write(typeof(123)+"<br>"); //number 3 document.write(typeof({a:1})+"<br>"); //object 4 document.write(typeof([])+"<br>"); //object 5 document.write(Array.isArray([])+"<br>"); //true 6 //如果当前浏览器的Array构造函数对象中不包含isArray 7 if(!Array.isArray){ 8 //为Array构造函数添加isArray方法 9 Array.isArray=function(obj){//4种 10 //判断obj是不是数组类型 11 //1. 如果Array.prototype在obj的原型链中 12 return Array.prototype.isPrototypeOf(obj); 13 //2. instanceof: 14 //语法:obj instanceof 构造函数名 15 //判断obj对象是否被构造函数创建 16 return obj instanceof Array; 17 //实例:一个构造函数创建出的每个具体对象 18 //3. 原型对象的constructor属性 19 return obj.constructor==Array; 20 //4. 利用Object原型的toString方法 21 /*call,applycall,在调用方法的一瞬间更换调用方法的对象*/ 22 return Object.prototype.toString.call(obj)== "[object Array]"; 23 } 24 } 25 document.write(Array.isArray([])+"<br>"); //true 26 document.write(Array.isArray({})+"<br>"); //false
  • 相关阅读:
    Bone Collector II(背包 求第k优解)
    How Many Answers Are Wrong (彻底理解带权并查集)
    System Testing(Codeforces Round #543 (Div. 2, based on Technocup 2019 Final Round))D
    Rikka with Minimum Spanning Trees徐州区域赛a题
    cin加速语句
    牛客练习赛41 b 666RPG (01背包)
    js字符串拼接优化
    nodejs中使用递归案例
    thunk的主要用法
    $in的方法总结
  • 原文地址:https://www.cnblogs.com/Medeor/p/4893257.html
Copyright © 2011-2022 走看看