1.今天费了九牛二虎之力终于完成了对原型链的学习,不多说了,看看下面的这篇文档,希望会对原型链有一个比较
清楚的认识,好文章还在后面,会继续出新文章的。
<script>
//本文开始先说明一下来验证一个重要的东西,好了不多说看代码
var test=function(){
alert("test");
}
test.prototype.say=function(){
alert("I have nothing to say");
}
//在js 中new 创建对象又是怎么一个过程呢?
//1.首先初始化一个对象 var t ={}
//2.t.__proto__=test.prototype
//3.test.call(t);
//关键在于第二步 验证 t.__proto__=test.prototype
var t=new test(); //每个对象在创建以后都会默认的生成的一个__proto__属性,我发现firefor将此属性给暴露出来了
alert(t.__proto__==test.prototype); // 返回true 验证
//下面看一个复杂一点的例子原型链的继承
var Person =function(){}
Person.prototype.say=function(){
alert("I am a Person");
}
Person.prototype.salary=100000;
var Programer=function(){
this.writeCode=function(){
alert("I will't write code until 99");
}
}
Programer.prototype=new Person();
//假如在函数外边定义函数属性就没有效果了
Programer.prototype.writeCode=function(){
alert("I'm writing code every second");
}
Programer.salary=1000;
var p=new Programer();
p.say(); //I am a Person
alert(p.salary); //1000
p.writeCode(); //I'm writing code every second
//为什么p.say()调用会有效果呢?其中的奥妙就在原型连,而原型链的作用,不在于prototype,而在于另一个属性,下面我们来做推导
//因为 var p=new Programer();
//p.__proto__=Programer.prototype
//又因为 Programer.prototype=new Person();
//so Programer.prototype.__proto__=Person.prototype
//所以 p.say()=Programer.prototype.__proto__.say()=Person.prototype.say();
//所以p.say() 会打印出 I am a Person
//其中起重要作用的是__proto__属性,因为他起到了,一个桥梁的作用
最后总结:
1.每个对象在创建后,都会创建一个默认的属性:__proto__ 其中 fireFox 将其暴露出来了
2.原型链的实现跟prototype 有着密切的关系,将这关系密切联系起来的是__proto__ 默认属性
3.当创建的对象调用的方法不存在时,此对象沿着原型链向他的上级去找,直到找到为止。
参考文档来自
http://kb.cnblogs.com/page/55718/