JS虽然不像JAVA那是种强类型的语言,但也有着与JAVA类型的继承属性,那么JS中的继承是如何实现的呢?
在构造函数中,同样属于两个新创建的函数,也是不相等的 函数Fn(名字){ this.name=名称; 这一点。显示=function () { 警报(this.name); } } var其中obj1=new Fn (“AAA”); var methoda=new Fn (" BBB "); console.log (obj1.show==obj2.show);//错误 此时可以看出构造函数的多次创建会产生多个相同函数,造成冗余太多。 利用原型原型解决。首先观察原型是什么东西 函数Fn () {} console.log (Fn.prototype);//构造函数表示当前的函数属于谁//__proto__==[[原型]],书面用语,表示原型指针 var fn1=new Fn (); var fn2=new Fn (); Fn.prototype。显示=function () { 提醒(1); } console.log (fn1.show==fn2.show);//真正的 此时,任何一个对象的原型上都有了展示方法,由此得出,构造函数Fn.prototype身上的添加的方法,相当于添加到了所有的Fn身上。
函数的父亲(技能){ 这一点。技能=技能; 这一点。显示=function () { 警报(“我”会+ this.skill); } } var=new父亲(“绝世木匠”); 函数的儿子(abc) {//这里的这个指向函数的儿子实例化对象//将父亲里面的这个改变成指向儿子的实例化对象,当相遇将父亲里面所有的属性和方法都复制到了儿子身上//Father.call (abc);//继承结束,叫适合固定参数的继承//Father.apply(这个论点);//继承结束,适用于适合不定参数的继承 } father.show () var=new儿子儿子(“一般木匠”);son.show ();
这个的么实现一个一个简单的拖拽,a→b的一个继承。把一个的功能继承给b。
HTML:
& lt; div id=" drag1 "祝辞& lt;/div> & lt; div id=" drag2 "祝辞& lt;/div>
CSS:
*{保证金:0;填充:0;} # drag1{宽度:100 px;高度:100 px;背景:红色;位置:绝对;} # drag2{宽度:100 px;高度:100 px;背景:黑色;位置:绝对的,左:500 px;}
, JS:,,
函数阻力(){} Drag.prototype={ 构造函数:拖拽, init函数(id) { this.ele=. getelementbyid (id); this.cliW=document.documentElement.clientWidth | | document.body.clientWidth; this.cliH=document.documentElement.clientHeight | | document.body.clientHeight; var=这个; this.ele.onmousedown=function (e) { var e=事件| | window.event; that.disX=e.offsetX; that.disY=e.offsetY; document.onmousemove=function (e) { var e=事件| | window.event; that.move (e); } that.ele.onmouseup=function () { document.onmousemove=零; } } }, 移动:函数(e) { this.x=e.clientX-this.disX; this.y=e.clientY-this.disY; this.x=this.x<0 & # 63; this.x=0: this.x; this.y=this.y<0 & # 63; this.y=0: this.y; this.x=this.x> this.cliW-this.ele.offsetWidth& # 63; this.x=this.cliW-this.ele.offsetWidth: this.x; this.y=this.y> this.cliH-this.ele.offsetHeight& # 63; this.y=this.cliH-this.ele.offsetHeight: this.y; this.ele.style.left=this.x +“px”; this.ele.style.top=this.y +“px”; } } 新的阻力().init (“drag1”) 函数ChidrenDrag () {} ChidrenDrag。原型=new拖() 新ChidrenDrag () .init (drag2)
函数的父亲(技巧,id) { 这一点。技能=技能; 这一点。id=id; } Father.prototype。显示=function () { 警报(“我是父亲,这是我的技能“+ this.skill); } 函数的儿子(){ Father.apply(参数); }//如果不做儿子的原型即成父亲的原型,此时会报错:儿子。显示不是一个函数 的儿子。原型=Father.prototype;//因为,如果不让儿子的原型等于父亲的原型,使儿子用应用是继承不到原型上的方法//但这是一种错误的原型继承示例,如果使用这种方式,会导致修改儿子原型上的显示方法时,会把父亲身上的显示也修改//内存的堆和栈机制 Son.prototype。显示=function () { 警报(“我是儿子,这是我的技能“+ this.skill); } var=new父亲(“专家级铁匠”,“父亲”); var=new儿子儿子(“熟练级铁匠”,“儿子”); father.show (); son.show (); 上面的示例应该修改成以下形式: 以上红色的代码应改成: 我在Father.prototype (var) { 的儿子。原型[我]=Father.prototype[我]; }//遍历父亲的原型身上的所有方法,依次拷贝给儿子的原型,这种方式称为深拷贝 这种继承方式叫做混合继承,用到了工党继承,细胞和苹果继承。老生常谈JS中的继承及实现代码