从数组到对象
修改属性和方法
var hero = {};//创建一个空对象
hero.breed = 'turtle';//添加一些属性和方法
hero.name = 'Mrli';
hero.sayName = function(){
return hero.name;
}
hero.sayName();//调用该方法
delete hero.name;//删除一个属性
使用this值
当我们处于某个对象方法内部时,还可以用另一种方法来访问同一对象属性,即该对象的特殊值this。
var hero = function(){
name:'Mrli',
sayName:function(){
return this.name;
}
}
hero.sayName();
构造函数
可用构造函数的方式来创建对象。下面看一个例子:
function Hero(){
this.occupation = 'Ninja';
}
var hero = new Hero();
hero.occupation;
使用构造函数的好处在于,他可以创建对象时接收一些参数。下面,我们就来修改一下上面的构造函数,是它可以通过接受参数的方式来设定name属性:
function Hero(name){
this.name = name;
this.occupation = 'Ninja';
this.whoAreYou = function(){
return "I’m "+this.name+" and i'm a "+this.occupation;
}
}
var h1 = new Hero('Jack');
var h2 = new Hero('Lucy');
h1.whoAreYou();
h2.whoAreYou();
instanceof操作符
通过instanceof操作符,我可以测试一个对象是不是由某个指定的构造函数所创建的。例如:
function Hero(){}
var h = new Hero();
var o = {};
h instanceof Hero;//true
h instanceof Object;//true
o instanceof Object;//true
传递对象
当我们拷贝某个对象或者将它传递给某个函数时,往往传递的都是该对象的引用。因此我们在引用上所做的任何改动,实际上都会影响它所引用的源对象。
var original = {
howmany:1
};
var copy = original;
cope.howmany;//1
copy.howmany = 100;
original.howmany;//100
同样的,将对象传递给函数的情况也是大抵如此:
var original = {
howmany: 100
};
var nullify = function (o){
o.howmany = 0;
}
nullify(original);
orifinal.howmany;
对象比较
当我们对对象进行比较操作时,当且仅当两个引用指向同一个对象时为true。而如果是不同的对象,即使他们碰巧拥有相同的属性和方法,比较操作也会返回false。
下面,我们来创建两个看上去完全相同的对象:
var fido = {breed:'dog'};
var benji = {breed:'dog'};
benji===fido;//false
benji==fido;//flase
我们可以新建一个变量mydog,并将其中一个对象赋值给它。这样一来mydog实际上就指向了这个变量。
var mydog = benji;
这种情况下,mydog与benji所指向的对象是相同的(也就是说,改变mydog的属性就等同于改变benji),比较操作就会返回ture。
mydog===benji;//true
并且,由于fido是一个不同的对象,所以不能与mydog进行比较。
mydog===fido;//false