2011.01.11——— javascript new以及继承的理解
2011.01.11——— javascript new以及继承的理解
一、new
function Person(age){
this.age = age;
}
var p = new Person(123);
alert(p.age);//123
详细说一下这个过程:
首先 new 创建了一个空的对象 也就是:
var o = new Object();
然后 对象o被this关键字引用,来给新创建的对象o赋予相应的属性:
o.age = age;
o.age = 123;
最后 返回对象o
return o;
var p = o;
二、关于继承
<html>
<head>
<script type="text/javascript">
function Person(){
this.name = "123";
this.sex = "f"
}
function XiaoDu(){
this.name = "xiaodu";
this.age = 22;
}
XiaoDu.prototype = new Person();
var o = new XiaoDu();
alert(o.name);
alert(XiaoDu.prototype.name);
alert(o.age);
alert(XiaoDu.prototype.age);
alert(o.sex);
alert(XiaoDu.prototype.sex);
XiaoDu.prototype.age = 33;
alert(o.age);
o.sex = "m";
alert(o.sex);
alert(XiaoDu.prototype.sex);
var o2 = new XiaoDu();
alert(o2.sex);
</script>
</head>
<body>
</body>
</html>
结果:
xiaodu
123
22
undefined
f
f
22
m
f
f
看上面的代码
我们一步一步来分析:
1、XiaoDu.prototype = new Person();根据上面的关于new的理解 流程应该是:
XiaoDu.prototype = {constructor: this};
var poo = new Object();
poo.name = "123"
poo.sex = "f";
XiaoDu.prototype = poo;
2、var o = new XiaoDu();这里注意一句话:
任何对象都有prototype属性,这个我个人感觉是针对通过构造函数生成的对象的,如new XX() 和 var o = {...},
这个两种是没有prototype属性的。追加一句:
虽然 new XXX()没有prototype属性,但是o有一个constructor属性,指向XiaoDu.prototype,如1的操作,则
o.constructor = function Person(){
this.name = "123";
this.sex = "f"
}
如果没有继承,则指向自己var xoo = new Object();
xoo.name = "xiaodu";
xoo.age = 22;
3、
alert(o.name);
alert(XiaoDu.prototype.name);
注意:
实际上是对属性的调用是沿着prototype的链来查找的,先找实例本身,再找其构造函数的prototype 依次向上 直到Object.prototype所以 先查找对象o的本身 有name属性 所以 就输出"xiaodu",但是对象实例o并没有覆盖构造函数的name值 依然是可以访问的
4、
alert(o.age);
alert(XiaoDu.prototype.age);因为XiaoDu.prototype已经不是指向本身了 而指向poo了,并且poo并没有age属性,所以构造函数有的属性 对象实例有的属性 ,
XiaoDu.prototype不一定有了
5、
alert(o.sex);
alert(XiaoDu.prototype.sex);这个就是o.sex是没有的 所以向上 从其构造函数的prototype里查找
6、
XiaoDu.prototype.age = 33;
alert(o.age);也就是
poo.age = 33;
又给对象增加了一个属性而已,
但是因为对象实例o已经有age属性了 所以直接输出;
7、
o.sex = "m";
alert(o.sex);
alert(XiaoDu.prototype.sex);
var o2 = new XiaoDu();
alert(o2.sex);这个仅仅是给对象实例加了一个属性 sex,从而查找的时候不从构造函数的prototype里面找了
但是
一个对象实例的属性改变 并不会影响其他实例的属性值 根据
clue 的指点 看了一下他说的 又写了一点个人感觉 忘了发到论坛了 下面是连接
http://lipeng88213.iteye.com/blog/868289
以上是自己的粗浅理解 有不对的地方 欢迎斧正