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
以上是自己的粗浅理解 有不对的地方 欢迎斧正
1 楼
lipeng88213
2011-01-11
我总觉得自己理解的不是很对。。怎么没有人来说说啊。。。
2 楼
clue
2011-01-11
建议读一读ECMAScript文档,它是JavaScript的实现标准
参照其中有关prototype chain(Types -> Object -> [[Get]])及construct(Function -> [[Construct]])部分的内容
参照其中有关prototype chain(Types -> Object -> [[Get]])及construct(Function -> [[Construct]])部分的内容
3 楼
lipeng88213
2011-01-11
clue 写道
建议读一读ECMAScript文档,它是JavaScript的实现标准
参照其中有关prototype chain(Types -> Object -> [[Get]])及construct(Function -> [[Construct]])部分的内容
参照其中有关prototype chain(Types -> Object -> [[Get]])及construct(Function -> [[Construct]])部分的内容
恩 谢谢 就怕没那个水平阅读。。。
4 楼
lipeng88213
2011-01-11
clue 写道
建议读一读ECMAScript文档,它是JavaScript的实现标准
参照其中有关prototype chain(Types -> Object -> [[Get]])及construct(Function -> [[Construct]])部分的内容
参照其中有关prototype chain(Types -> Object -> [[Get]])及construct(Function -> [[Construct]])部分的内容
根据您说的 我看了看 但是不是太懂 又写了一些 您看下 http://lipeng88213.iteye.com/blog/868289
5 楼
kyfxbl
2011-01-17
为什么这个帖也有人隐藏?
6 楼
lipeng88213
2011-01-17
kyfxbl 写道
为什么这个帖也有人隐藏?
写的不好吧 呵呵
7 楼
bigbird2444
2011-01-29
var p = new Person(123);
不赞同 你的观点
我认为 Person 是继承于Object 同时又是Function的实例
p 是person的实例
不是先new了一个Object 又添加属性的
new是复制对象 并添加原型地址到_proto_
关于prototype 你说两种情况其实是一种 就是一个要最终应用的实例
这种情况不是没有prototype 而是没有赋值
如果你需要其作为引用类型 创建新实例的时候 可以添加原型
纯属个人观点