关闭

JavaScript中的继承和原型

发表于:2012-12-11 09:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:LEED    来源:51Testing软件测试网采编

  JavaScript是基于原型的面向对象语言,没有类的概念,我们先来说说原型prototype。

  每个对象都有原型,原型是一种对象,修改对象的原型,可以影响所有由本对象派生的对象,但是如果仅仅修改本对象,并不会影响已经创建的实例的原型。因为每个对象和原型都有一个原型,对象的原型指向对象的父原型,而父原型又指向父原型的父原型,这种通过原型层层连接起来的关系称为原型链,这条链的末端一般总是默认的对象原型。

  原型中读的是从原型链上读,写是往自己里面写。

<script type="text/javascript">            function load() {
                    function obj1() {//对象obj1
                    }
                    function obj2() {//对象obj2
                    }
                    obj2.prototype = new obj1(); //obj1赋值给obj2的原型
                    Object.prototype.foo = function () {
                            alert("object"); //Object对象foo函数弹出object
                    }
                    testobj = new obj2(); //obj2赋值给测试对象testobj
                    testobj.foo(); //执行测试对象的foo函数
                    obj1.prototype.foo = function () {
                            alert("obj1"); //对obj1的原型函数foo重新赋值
                    }
                    testobj.foo(); //在此执行测试对象的foo函数
            }
            window.onload = load;
</script>

  运行结果:

  结果分析:

  我们先创建了对象obj1和obj2,把obj1的原型赋值给obj2,再Object的原型中添加函数foo显示‘Object’,再把obj2赋值给测试对象testobj,执行testobj中的foo,我们发现实际执行的是Object中的foo,为什么?因为读取的时候,一次从testobj---obj2---obj1---Object读取,直到Object方能读取到foo,所以说读是从原型链从浅入深读取。然后我们修改obj1的原型,使之也有foo函数,再次执行testobj的foo,我们发现实际执行的是obj1的foo,可见对obj1写foo的时候是直接写到自己的原型上的。如图:

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号