JavaScript中的面向对象【三】
返回对象的函数
除了通过构造器函数和new 操作符创建对象,你也可以用一个普通的函数在不用new 操作符的情况下创建对象。
你可以有一个做一些预备工作的函数并且一个对象作为返回值被返回:
function ReturnObject(name) { //定义一个函数,它返回一个对象 return { name: name }; } var myObj = ReturnObject('John'); document.write(myObj.name);
事实上,你也可以用构造器函数返回对象,不同之处在于this。
因为构造器函数默认是返回this,也就是说,你可以你可以修改构造器函数的默认行为,让我们看看是怎么样的:
function ReturnObject02(name) { this.name = name; return { age: 18 }; //返回的是一个对象 } var myObj02 = ReturnObject02('Jack'); document.write(myObj02.age); //访问不了ReturnObject02中的name属性, //因为默认情况下ReturnObject02返回包含属性name的对象, //而现在构造器函数返回一个包含属性age的其它对象。 document.write(myObj02.name);
这种情况只有在返回值是一个对象的时候才有可能。否则如果你试图返回一个不是对象的任何东西。构造器将处理它通常的行为并且返回this。
function ReturnObject03(name) { this.name = name; return 5; //返回的不是一个对象 } var myObj03 = new ReturnObject03('Jeff'); //我们可以访问对象myObj03的name属性
document.write(myObj03.name);
传递对象
当你拷贝一个对象或者把它传给一个函数,你仅仅传递了对象的引用。接下来,如果你对引用进行了修改,你实际上也修改了原始的对象。
让我们看下面的例子:
function MyConstructor(){ this.name = 'John'; } var myCon = new MyConstructor(); var myCon02 = myCon; document.write(myCon.name); document.write(myCon02.name); //修改myCon02的name属性,同时它也把引用的myCon的name属性修改了 myCon02.name = 'Jeff'; document.write(myCon.name); document.write(myCon02.name);
当把对象传递给函数时也会发生一样的事情
我们在看一个例子:
function MyConstructor02(obj) { obj.name = 'Johnson'; } document.write(myCon02.name); MyConstructor02(myCon); document.write(myCon02.name);
== 与 ===
//= = 相等比较,当2 个操作数相等的时候返回true //在比较之前,操作数会被自动转换为相同的类型 //true document.write(1 == 1); //false document.write(1 == 2); //true document.write(1 == '1'); //= = = 恒等比较。当类型相同并且值相同的情况下就返回true。 //一般来讲,用这种方式进行比较更好更安全,因为没有进行自动的类型转换 //false document.write(1 === '1'); //true document.write(1 === 1);
对象比较
当比较对象时,只有当2个变量引用到同一个对象时才返回true。即使比较2 个有相同的属性、方法的对象也仍然返回false.
function MyObj(){ this.name = "John"; } //都引用了MyObj var myObj01 = new MyObj(); var myObj02 = myObj01; //因此都是true document.write(myObj01 == myObj02); document.write(myObj01 === myObj02); //引用了不同的对象,虽然属性名称和属性值一样 var Obj01 = { name: 'Jeff' }; var Obj02 = { name: 'Jeff' }; //因此都是false document.write(Obj01 == Obj02); document.write(Obj01 === Obj02);
内置对象
内置的对象可以分为3 类:
- 数据包装对象
- Object,Array,Function,Boolean,Number,String.这些对象对应JavaScript中不同的数据类型。
- 一般来讲,除了“undefined”和“null” ,所有由typeof 操作符返回的值都有一个对应的数据包装对象。
- 工具(Utility)对象
- 这些是Math,Date,RegExp
- Error 对象
- Error 对象跟其他对象一样,只是功能更特定。当某些不希望的事情发生的时候,它可以帮你的程序恢复到工作状态。
Object
Object是所有JavaScript中对象的父对象,这也就是说每一个你创建的对象都继承于它。
为了创建一个空对象,你可以用对象文本标记法也可以用Object()构造器函数。
下面的2 行代码是等价的
var o={}; var o =new Object();
完全空的对象并不是完全没用的,因为他已经包含了一些方法和属性。让我们看看几个:
- o.constructor 属性返回构造器函数
- o.toString()返回对象的字符串表示
- o.valueOf 返回对象的一个单值表示,通常就是对象自己。
o.valueOf() === o