js的原型继承问题,有些不解...

x269147836 2011-12-30 03:10:47


<script type="text/javascript">
var c1=function(){this.name="xw1";}
var c2=function(){this.name="xw2";}
c2.prototype=new c1();
var o2=new c2();
alert(o2.constructor);//c1
</script>

js权威指南上 只是说可以通过c2.prototype.construction=c2;来改回constructor属性
但是我还是弄不明白,c2.prototype=new c1(); 这句到底做了些什么......
...全文
152 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
x269147836 2011-12-31
  • 打赏
  • 举报
回复
还是有些模糊的地方,看来功力还不够,~继续啃书去.谢谢大家,感谢各位~:)
hckxzy 2011-12-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 maderic 的回复:]

JScript code

c2.prototype=new c1();//这句话修改了c2原型链中的constructor
//单纯的function里没有constructor属性,
//o2.constructor其实是在o2的原型链中找constructor属性,
//c2.prototype.constructor原本应该是c2的,
//但是c2.prototype=new c1()……
[/Quote]
修改了c2原型连,constructor是原型对象的属性
MadEric 2011-12-31
  • 打赏
  • 举报
回复

c2.prototype=new c1();//这句话修改了c2原型链中的constructor
//单纯的function里没有constructor属性,
//o2.constructor其实是在o2的原型链中找constructor属性,
//c2.prototype.constructor原本应该是c2的,
//但是c2.prototype=new c1();这句话修改了c2原型链中的constructor,使其指向了c1
//所以最后一句alert(o2.constructor);会再c2原型链中找到已经指向c1的constructor
//当执行c2.prototype.construction=c2的时候,变会使原型链中的constructor重新指向c2

hckxzy 2011-12-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hckxzy 的回复:]

JScript code
var c1=function(){this.name="xw1";}
var c2=function(){this.name="xw2";}
c2.prototype=new c1();
var o2=new c2();
console.log(o2.hasOwnProperty('constructor'));//false
console.log(o2.__pr……
[/Quote]
说明:firefox 中firebug下的实验
hckxzy 2011-12-31
  • 打赏
  • 举报
回复
var c1=function(){this.name="xw1";}
var c2=function(){this.name="xw2";}
c2.prototype=new c1();
var o2=new c2();
console.log(o2.hasOwnProperty('constructor'));//false
console.log(o2.__proto__.hasOwnProperty('constructor'))//o2.__proto__指的是new c1();
console.log(o2.__proto__.__proto__.hasOwnProperty('constructor'));//true
alert(o2.constructor);//其实o2.constructor是延其原型链一直找到o2.__proto__.__proto__才找到的,而并非o2对象自身的属性
KeenWon 2011-12-31
  • 打赏
  • 举报
回复
简单来说:他做的就是搞一个新的c1来当c2的原型

复杂的看这里:

这个看完看懂你就成功了 http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html

还有这个 http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html
x269147836 2011-12-31
  • 打赏
  • 举报
回复

看看先~tks..
[Quote=引用 2 楼 b48121905 的回复:]
每个类型都有他的prototype,而每个prototype都是一个Object对象(Function内置对象prototype有点特殊)。
每个类型的prototype都包含有constructor属性,该属性用于当用该类型生成一个对象时确定用哪个constructor来初始化该对象,有点象面向对象的构造器。
c2.prototype=new c1();这句话就是改变了c2的prototyp……
[/Quote]
x269147836 2011-12-31
  • 打赏
  • 举报
回复
这个我看过了,可是这个只是讲怎么用的~.我想知道它是怎么实现的呢..
貌似将这个称之为“伪经典继承”吧,想了解一下这个“伪”的含义...我木有其他的语言基础呢 ~所不是很了解真正的面向对象中的继承..
[Quote=引用 1 楼 zsx841021 的回复:]
http://apps.hi.baidu.com/share/detail/15482416
[/Quote]
b48121905 2011-12-30
  • 打赏
  • 举报
回复
每个类型都有他的prototype,而每个prototype都是一个Object对象(Function内置对象prototype有点特殊)。
每个类型的prototype都包含有constructor属性,该属性用于当用该类型生成一个对象时确定用哪个constructor来初始化该对象,有点象面向对象的构造器。
c2.prototype=new c1();这句话就是改变了c2的prototype,这样就改变了c2类型所指向的constroctor。而通过原型链来获得c1的constroctor。
至于什么是原型链,其概念不是三言两语讲得清楚。
建议看下下面的两篇文章,一篇看完看另外一篇,有点复杂。。
http://www.csser.com/dev/52.html
http://www.cnblogs.com/RicCC/archive/2008/02/15/JavaScript-Object-Model-Execution-Model.html
三石-gary 2011-12-30
  • 打赏
  • 举报
回复
http://apps.hi.baidu.com/share/detail/15482416

87,901

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧