• javascript基础-js对象


    一、js对象的创建

    1.普通最简单的方式

    var teacher = new Object( );
    teacher.name = "zhangsan";
    teacher.age = 35;
    teacher.job = "教师";
    teacher.say function( ) {
        return this.name + this.age + this.job;        //this代表的是teacher下的作用域
    };
    console.log(teacher.say( ));

    2.对象初始化(单体方式)-json格式,不适合多个对象

    var json = {name:"张三", age:15, sex:1, show:function( ){alert(this.name+this.age+this.sex)},};
    var person = {
        name : "张三",
        age : 25,
        say : function ( ) {
            return "我是张三";   
        },
        action : function( ) {
            return "正在学习关于js高级应用...";   
        },
    };
    console.log(person.name +" "+ person.age);
    console.log(person.say() +" "+ person.action());

    3.构造函数创建

    function Student(_name, _age) {
        this.name = _name;
        this.age = _age;
        this.say = function( ) {
            return "我是"+this.name+",我今年"+this.age+"岁了。";   
        }   
        this.action = function( ) {
            return "正在动手操作js高级应用...";   
        }
    }
    var student = new Student("李四", 22);
    console.log(student.say( )+" "+student.action( ));

    4.工厂模式

    function createObject(_name, _age){
        var obj = new Object();    //私有对象obj,因此是无法通new方法
        obj.name = _name;
        obj.age = _age;
        obj.run function( ) {
            return this.name + this.age;
        };
        return obj;        //返回对象的引用(返回的类型为Object类型) 
    }
    var obj1 = createObject("tom", 25);
    var obj2 = createObject("jack", 30);
    console.log(obj1.run());
    console.log(obj2.run());

    二、js对象的方法

     对象的方法也可以划分为 私有方法、对象方法、类方法

    function Person( ) {
        //对象方法
        this.getUsername = function( ) {
            return "admin";
        }
        //私有方法
        var getPassword = function( ) {
            return "123456";
        }
        //调用私有方法
        console.log("密码:"+getPassword( ));
        //对象方法
        Person.prototype.getAge = function( ) {
            return 25;
        }
    }
    //对象方法
    Person.prototype.getName = function( ) {
         return "admin" ;
    }
    Person.prototype = {
         start : function( ) {
              return "start";
         },
         end : function( ) {
              return "end";
         }
    }
    //类方法
    Person.getCountry = function( ) {
        return "China";
    }
    var p = new Person( );
    console.log("用户名:"+p.getUsername( ));
    console.log("年龄:"+p.getAge( ));
    console.log(Person.getCountry( ));

    两种写法的对比

     方式一:

    function Student() {
        this.name = "cxb";
        this.talk = function() {
            return "我叫" + this.name;
        }
    }
    var stu1 = new Student();
    var stu2 = new Student();

     方式二:

    function Student() {
        this.name = "cxb";
    }
    Student.prototype.talk = function() {
        return "我叫" + this.name;
    }
    var stu1 = new Student();
    var stu2 = new Student();

     方式一与方式二产生的结构几乎是一样的,而本质区别就是:方式二new产生的二个实例对象共享了原型的talk方法,这样的好处节省了内存空间,方式一则是要为每一个实例复制talk方法,每个方法属性都占用一定的内存的空间,所以如果把所有属性方法都声明在构造函数中,就会无形的增大很多开销,这些实例化的对象的属性一模一样,都是对this的引用来处理。除此之外方式一的所有方法都是拷贝到当前实例对象上。方式二则是要通过scope连接到原型链上查找,这样就无形之中要多一层作用域链的查找了。

    注:prototype方式的位置不能随意互换

    function Person() {
    
    }
    // 位置一
    Person.prototype = {
        walk : function() {
            console.log("walk")
        },
        run : function() {
            console.log("run")
        }
    }
    // 位置二
    Person.prototype.talk = function() {
        console.log("talk")
    }
    
    var p = new Person();
    p.talk()
    console.log(Person.prototype) 
    如果位置一和位置二调换,p.talk()异常 Uncaught TypeError: p.talk is not a function
    console.log(Person.prototype) 打印信息如下:
    如果位置一和位置二调换,会少一个原型链方法

    三、js对象的属性

    js对象的属性也可以划分为:对象属性、私有属性、类属性

    function User( ) {
        this.username = "admin";     //对象属性
        var password = "123456";    //私有属性
        this.getPassword = function(){
            return password;    //获取私有属性的方法
        }
        User.prototype.age = 25;    //对象属性
    }
    User.country = "China";        //类属性
    var user = new User( );
    console.log("用户名:"+user.username);
    console.log("密码:"+user.getPassword( ));
    console.log("年龄:"+user.age);
    console.log("国籍:"+User.country);
    
    //length属性
    function box(name, age){
        return name+age;
    }
    console.log(box.length);        //返回box中的参数个数
    console.log(User.length);

    四、js对象的引用

    对象的引用其实就是将一个对象赋值给另一个对象的过程

    var a = 123;
    var b = a;
    a = "张三";
    console.log("a的值:"+ a);    //将打印张三
    console.log("b的值:"+ b);    //将打印123
    
    var x = 240;
    var y = x;
    x = 320;
    console.log("x="+ x);
    console.log("y="+ y);
    
    var array1 = [1,2,3];
    var array2 = array1;
    array2.push(4);        //array1.push(5);结果一样
    console.log("array1:"+ array1);
    console.log("array2:"+ array2);
    
    var arr1 = [1,2,3];
    var arr2 = [];
    arr2 = arr1;
    arr2.push(4);
    console.log(arr1);    //显示1,2,3,4
    console.log(arr2);    //显示1,2,3,4

    五、命名空间

    使用命名空间可以解决同名函数冲突问题及防止变量的污染,命名空间采用JSON方式

    var com = { };
    com.bj = { };
    com.sh = { };
    com.hz = { };
    
    com.bj.get = function( ) {
        console.log("北京");
    }
    
    com.sh.get = function( ) {
        console.log("上海");
    }
    
    com.hz.get = function( ) {
        console.log("杭州");
    }
    
    com.bj.get( );
    com.sh.get( );
    com.hz.get( );

    六、this关键字

    1.普通最简单的方式 

    //当全局作用域调用函数时,this对象引用的就是window
    //this指代的是当前的方法属于谁 或 当前发生事件的对象
    //window是一个对象,而且是js中最大的对象,是最外围的对象
    console.log(window);                   //输出:[object Window]
    console.log(typeof window);        //输出object object类型
    console.log(this);                          //输出:[object Window] this目前表示的是window,因为是在window范围下
    console.log(typeof this);              //输出object object类型
    //上面的this就是window
    
    var color = "红色的";                 //这里的color是全局变量,而这个变量又是window的属性
    console.log(window.color);        //输出:红色的
    console.log(this.color);              //输出:红色的
    
    window.color = "红色的";            //相当于    var color="红色的";
    console.log(this.color);
    
    var box = {
        color:"蓝色的",                           //这里的color是box下的属性
        showColor : function( ) {
            alert("box:"+this.color);        //这里的this.color,代表的是box下的color
        }   
    }
    //例:全局的方法属于window对象下的
    function show(){
        alert("show():"+this.color );        //这里的this.color,其实还是在window下,这里执行的是动态的,第一次在window下,第二次在box2下
    }
    //其实上一种写法等同于:window.show=function(){...}  即这里的 show()方法属于window对象的
    alert(" "+this.color);
    box.showColor( );
    show( );
    //
    var box2 = {
        color:"黄色的",   
    }
    box2.showColor = show;    //这段代码相当于如下:
    box2.showColor( );
    /*
    var box2 = {
        color:"黄色的",
        showColor:function( ) {
            alert("box:"+this.color);
        }       
    }
    */
    
    //例:
    var array = [1, 2, 3, 4];
    array.a = 20;
    array.getA = function( ) {
        console.log(this.a);    //这里的this代表array对象
    }
    
    var oDiv = document.getElementById("box");
    oDiv.onclick = function( ) {
        console.log(this);        //这里的this代表oDiv对象   
    }

    七、内置对象

    1.URI编码方法 功能:字符串解析。功能非常强大,但也非常危险。

    var name = "//Lee李";
    var a = encodeURI(name);
    var b = encodeURIComponent(name);
    console.log(name);
    console.log(a);            //只对中文进行编码
    console.log(b);           //对所有进行编码(中文及特殊字符)
    //解码
    console.log(decodeURI(a));
    console.log(decodeURIComponent(b));

    2.eval方法

    eval("var num = 100");
    console.log(num);
    //字符串"var num = 100",其实就是一段javascript代码,eval会把这个字符串解析成javascript
    eval("console.log(250)");
    console.log(eval("console.log(250)"));     //打印出250及undefined(先执行里面的打印)
    
    eval("function show( ){return 666;}");
    console.log(show( ));

    3.global 

    //alert(Global);
    var box = "Lee";
    console.log(window.box);
    console.log(Object); //返回一个构造函数
    • Global对象无法直接访问
    • Global对象内置属性和方法
    • Global对象的属性:undefined、NaN、Object、Array、Function等。
  • 相关阅读:
    HTML 特殊符号编码对照表
    jsp include file(变量) 动态加载文件
    PHP判断键值数组是否存在,使用empty或isset或array_key_exists
    [js方法pk]之instanceof() vs isPrototypeOf() hasOwnProperty() vs propertyIsEnumerable()
    js正则表达式语法 修正
    js正则表达式语法
    js正则表达式语法
    ASP中有关字符编码转换的几个有用函数
    详解js中typeof、instanceof与constructor
    事件穿透父层 直达子层 pointer-events:none
  • 原文地址:https://www.cnblogs.com/caoxb/p/9377223.html
Copyright © 2020-2023  润新知