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等。

 

posted @ 2018-07-27 13:56  cao_xiaobo  阅读(465)  评论(0编辑  收藏  举报