javascript 对象的深入理解
2012-08-15 16:59
323 查看
1.普通函数与构造函数
普通函数与构造函数本质上没有任何区别,只是我们调用的方式不同而已,关键在于一个字 new。
调用构造函数:new function_name();
调用普通函数:function_name();
在函数中有一个this对象,this始终代表该函数的调用者。
如果是构造函数,this就是构造出来的新对象。
如果是普通函数,this就是 window 对象。
如果使用new 关键字调用,那么函数的 return 语句不再起作用,因为这时还回的是 this 对象。
2.关于js对象的动态特性
对象的成员属性和方法可以动态添加。
3.prototype 对象
prototype对象只有函数才有,而new创建的对象该属性,她是构造函数创建对象所参考的原型。
如果如果向prototype对象添加属性和方法,那么当下次使用new创建对象时,会以最新的prototype为参考原型。
如果要修改和删除原型中的属性,只能给prototype赋值一个新的对象,而不能修改prototype的属性
Js的所有对象都是基于原型(prototype)来创建的。她的继承机制默认是原型对象的继承。
4. 创建对象最好采用下面方式
用构造函数定义对象的成员属性属性,用原型方式定义对象的成员方法。
这样的好处是:每个对象都共享一个方法,并且都具有自己独立的属性实例。
普通函数与构造函数本质上没有任何区别,只是我们调用的方式不同而已,关键在于一个字 new。
调用构造函数:new function_name();
调用普通函数:function_name();
在函数中有一个this对象,this始终代表该函数的调用者。
如果是构造函数,this就是构造出来的新对象。
如果是普通函数,this就是 window 对象。
如果使用new 关键字调用,那么函数的 return 语句不再起作用,因为这时还回的是 this 对象。
function Boo(name){ this.name=name; this.whatAreYou=function(){ return 'I am a '+ this.name; }; } var obj = new Boo("obj"); Boo.name = "Boo"; alert(obj.name + "\n" + Boo.name);
2.关于js对象的动态特性
对象的成员属性和方法可以动态添加。
function Foo(){ this.name="Foo"; } var obj = new Foo(); obj.name = "Foo1"; obj.m = "m"; delete obj.name; alert("name:"+obj.name+"\nm:"+obj.m);
3.prototype 对象
prototype对象只有函数才有,而new创建的对象该属性,她是构造函数创建对象所参考的原型。
如果如果向prototype对象添加属性和方法,那么当下次使用new创建对象时,会以最新的prototype为参考原型。
如果要修改和删除原型中的属性,只能给prototype赋值一个新的对象,而不能修改prototype的属性
Js的所有对象都是基于原型(prototype)来创建的。她的继承机制默认是原型对象的继承。
function ClassA() { } ClassA.prototype.color = "blue"; ClassA.prototype.sayColor = function () { alert(this.color); }; function ClassB() { } ClassB.prototype = new ClassA();
4. 创建对象最好采用下面方式
用构造函数定义对象的成员属性属性,用原型方式定义对象的成员方法。
这样的好处是:每个对象都共享一个方法,并且都具有自己独立的属性实例。
function Car(sColor,iDoors,iMpg) { this.color = sColor; this.doors = iDoors; this.mpg = iMpg; this.drivers = new Array("Mike","John"); } Car.prototype.showColor = function() { alert(this.color); }; var oCar1 = new Car("red",4,23); var oCar2 = new Car("blue",3,25); oCar1.drivers.push("Bill"); alert(oCar1.drivers); //输出 "Mike,John,Bill" alert(oCar2.drivers); //输出 "Mike,John"
相关文章推荐
- 深入理解JavaScript系列(47):对象创建模式(上篇)
- 深入理解JavaScript系列(47):对象创建模式(上篇)
- 深入理解JavaScript系列(9):根本没有“JSON对象”这回事!
- 深入理解JavaScript作用域、变量对象、闭包
- 【六】深入理解javascript创建对象的七种方式
- 深入理解JavaScript系列(12):变量对象(Variable Object)
- 深入理解JavaScript系列(47):对象创建模式(上篇)
- 深入理解JavaScript系列(47):对象创建模式(上篇)
- 深入理解JavaScript系列(12):变量对象(Variable Object)
- 深入理解javascript内部原理(2): 变量对象(Variable object)
- 深入理解JavaScript系列(48):对象创建模式(下篇)
- 深入理解JavaScript系列(48):对象创建模式(下篇)
- 深入理解JavaScript系列(12):变量对象(Variable Object)
- 深入理解javascript原型和闭包(2)——函数和对象的关系
- 深入理解JavaScript中的对象
- 深入理解JavaScript系列(2):变量对象(Variable Object)
- 深入理解javascript构造函数和原型对象
- 深入理解JavaScript系列(48):对象创建模式(下篇)
- 深入理解JavaScript创建对象的多种方式以及优缺点
- 深入理解JavaScript的闭包特性 如何给循环中的对象添加事件(转载)