对象可以使一些无关的变量建立某种联系,使这些变量成为一个整体也就是对象,这些变量也就成为这个对象的属性
对象具有属性和方法
var obj = {};这是一个对象,但这个对象没有属性,方法
如果取属性值则为:对象名.属性名
如果调用方法则为:对象名.方法名()
如果一个对象没有某个属性或方法,那么取值时会得到undefined,不会报错
字面式创建对象:
var obj = {};
console.log(obj.name);//undefined
//可以直接在定义对象时添加属性和方法
var obj = {
name:"孙悟空",
age:18,
sayHello:function(){
console.log(this.name);
}
}
console.log(obj.name); //孙悟空
添加属性时,如果对象里已有这个属性,则会覆盖,删除属性为:delete 对象名.属性名;(delete obj.name;)
任意对象在布尔转换时都为true
构造函数:
一个普通函数,当它和new运算符一起使用时,该函数成为构造函数,通常会将构造函数的首字母大写,构造函数一般是专门用来创建对象的函数。
var obj = new Object(); //Object为构造函数
console.log(obj); //Object{}
obj.name = "孙悟空";
obj.age = 18;
console.log(obj); //Object{name:"孙悟空",age:18}
可以使用工厂方法创建对象,该方法可大批量创建对象,也就是在一个函数中创建一个对象,然后创建不同的对象可以通过调用该函数传入不同参数来实例化不同对象。
function creatObj(name, age, gender){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.gender = gender;
obj.sayHello = function(){
console.log(this.name);
}
return obj;
}
var obj1 = creatObj("孙悟空",18,"男");
var obj2 = creatObj("沙和尚",30,"男");
var obj3 = creatObj("蜘蛛精",16,"女");
console.log(obj1); //Object{name...}
console.log(obj2); //Object{name...}
console.log(obj3); //Object{name...}
console.log(typeof(obj1)); //object
console.log(typeof(obj2)); //object
console.log(typeof(obj3)); //object
使用工厂方法创建对象时使用的构造函数都是Object,所以创建的对象都是Object这个类型,这会导致我们无法区分出多种不同类型的对象。所以我们还可以通过构造函数来创建对象
function Person(name, age){
this.name = name;
this.age = age;
this.sayHello = function(){
console.log(this.name);
}
}
function Dog(name, age){
this.name = name;
this.age = age;
this.sayHello = function(){
console.log(this.name);
}
}
var obj1 = new Person("猪八戒",28);
console.log(obj1); //person{name:...}
console.log(typeof(obj1));
console.log(obj1 instanceof Person); //true
console.log(obj1 instanceof Dog); //false
var obj2 = new Dog("旺财",3);
console.log(obj2); //dog{name:...}
console.log(typeof(obj2));
console.log(obj2 instanceof Dog); //true
使用同一个构造函数创建的对象,我们称为一类对象(所以可以将一个构造函数成为一个类)
,我们通过一个构造函数创建的对象,称为是该类的实例,使用instanceof可以检查一个对象是否是一个类的实例。
instanceof语法:对象 instanceof 构造函数,如果是实例,返回true,否则返回false
任意对象的返回值:
var obj = {};
document.write(obj); //[object Object]
这是因为任意对象默认的字符串表示形式默认调用toString()方法,toString()方法在原型的原型中,想要改变这种显示方式,只需要重写toString()方法。
var obj = {};
obj.toString = function(){
return "默认方法改变";
}
document.write(obj); //默认方法改变
但如果想要从根本上改变这种方式,应该在原型的原型中改变这个方法
function Person(name, age){
this.name = name;
this.age = age;
}
var obj1 = new Person("猪八戒",28);
var obj2 = new Person("唐僧",20);
/*--如果仅仅更改obj1的toString()方法,则对于obj2还是输出[Object object]*/
/*obj1.toString = function(){
return "我的名字:"+this.name+",我的年龄:"+this.age;
}
document.write(obj1); //我的名字:猪八戒,我的年龄:28
document.write(obj2); //[Object object] */
/*所以要在原型中更改toString()方法*/
Person.prototype.toString = function(){
return "我的名字:"+this.name+",我的年龄:"+this.age;
}
document.write(obj1); //我的名字:猪八戒,我的年龄:28
document.write(obj2); //我的名字:唐僧,我的年龄:20
console.log(obj1); //Person{name:"猪八戒"...}
console.log(obj1.__proto__.__proto__.hasOwnProperty("toString"));//true hasOwnProperty()方法只有当对象自身中含有属性时,才会返回true