JavaScript面向对象编程指南 读书笔记4-02
全局对象
程序所在的宿主环境一般都会为其提供一个全局对象,所谓的全局变量其实只不过都是这个对象的属性而已。如以下例子:
var a = 1;//当作一个变量a来访问 window.a;//当作全局对象的一个属性来访问 this.a;//通过this所指向的全局对象属性来访问
再来看以下例子:
function Hero(name) {
this.name = name;
}
var h = Hero('Leonardo');
typeof h;
运行以上例子,返回的是undefined,这是由于我们在hero中使用了this,所以这里会创建一个全局变量,同时也是全局对象的一个属性。
而如果我们使用new来调用相同的构造器函数,就会创建一个新的对象,并且this会指向当前对象。
var h2 = new Hero('Michelangelo');
typeof h2;
构造器属性
当我们创建对象的时候,实际上同时也赋予了该对象一种特殊的属性--构造器属性。该属性实际上是一个指向用于创建该对象的构造函数的引用。如:
h2.constructor; 由于构造器属性引用的是一个函数,因此我们可以用它来创建一个新的对象
var h3 = new h2.constructor('Rafaello'); 另外,如果对象是通过对象文本标识法所创建的,实际上它使用的是由内建构造器Object()函数所创建的
var o = {}; o.constructor; typeof o.constructor; instanceof操作符
instanceof操作符,可以测试一个对象是否由某个指定的构造器所创建。
function Hero(){}
var h = new Hero();
var o = {};
h instanceof Hero;
h instanceof Object;
o instanceof Object; 返回对象的函数
除了使用new操作符调用函数构造器之外,可以抛开new操作符,只用一般函数来创建对象。这就需要一个能执行某些预备工作,并以对象为返回值的函数。
//用于产生对象的简单函数factory()
function factory(name){
return{
name:name;
}
}
//调用factory()来生成对象
var o = factory('one');
o.name;
o.constructor;
实际上,构造器也是可以返回对象的。
function C2(){
this.a =1;
return {b:2};
}
//此处构造器返回的不再是包含a属性的this对象,而是另一个包含属性b的对象
var c2 = new C2();
typeof c2.a;
c2.b;
传递对象
当我们拷贝某个对象或将它传递给某个函数时,往往传递的是该对象的引用;因此我们在引用上做的任何修改,实际上都会影响它所引用的原对象。
//将对象赋值给变量的情况
var original = {howmany:1};
var mycopy = original;
mycopy.howmany;
mycopy.howmany = 100;
original.howmany;
//将对象传递给函数的情况
var original = {howmany:100};
var nullify = function(o){o.howmany = 0};
nullify(original);
original.howmany;
比较对象
对对象进行比较操作时,当且仅当两个引用指向的是同一个对象的时候,结果为true;
Webkit控制台中的对象
在控制台中只要输入对象的名字并按enter,就会返回一个单词object,点击前面的箭头,可以展开它的属性。
控制台还提供了console对象和一系列的方法。比如console.log()和console.error().
for(var i = 0; i < 5; i++){
console.log(i);
}

