Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 747|回复: 0

javascript 继承的实现--例子

[复制链接]

该用户从未签到

发表于 2011-10-12 11:14:48 | 显示全部楼层 |阅读模式
<script type="text/javascript">
/**js继承的实现
    ECMAScript 中实现继承的方式不止一种。

    这是因为 JavaScript 中的继承机制并不是明确规定的,
    而是通过模仿实现的。这意味着所有的继承细节并非由解释程序处理。
*/
/**第一种
    对象冒充---构造函数使用 this 关键字给所有属性和方法赋值

(即采用类声明的构造函数方式)。
    因为构造函数只是一个函数,所以可使 ClassA 的构造函数成为 ClassB 的方法,

    然后调用它。
    ClassB 就会收到 ClassA 的构造函数中定义的属性和方法。
*/
function ClassA(sColor){
  this.color = sColor;
  this.sayColor = function(){
   alert(this.color);
  }
}
function ClassB(sColor, sName){
  this.newMethod = ClassA;//把ClassA赋予一个方法
  this.newMethod(sColor);//调用newMethod
  delete this.newMethod;//只是删除ClassA的引用newMethod,其的属性和方法已被继承下来了
  this.name = sName;
  this.sayName = function(){
   alert(this.name);
  }
}
var b = new ClassB('b','bb');
//call()方法--与对象冒充方法相似,第一个参数用作this的对象。其他参数都直接传递给对象自身
function ClassC(sColor, sName){
  ClassA.call(this, sColor);
  this.name = sName;
  this.sayName = function(){
   alert(this.name);
  }
}
var c = new ClassC('c', 'cc');
//apply()方法--与call()相似,两个参数,用作this的对象和要传递给参数的数组
function ClassD(sColor, sName){
  //ClassA.apply(this, arguments); 这种写法只能是超类中的参数顺序与子类中顺序一致是才能用
  ClassA.apply(this, [sColor]);//只能是数组 或者 new Array(sColor)
  this.name = sName;
  this.sayName = function(){
   alert(this.name);
  }
}
var d = new ClassD('d', 'dd');
/**
原型链--用另一类型的对象重写类的 prototype 属性。
prototype 对象的任何属性和方法都被传递给那个类的所有实例。
子类的所有属性和方法都必须出现在 prototype 属性被赋值后,

因为在它之前赋值的所有方法都会被删除。
缺点:使用原型链,就无法使用带参构造函数了
*/
function ClassE(){
  this.age = '23';
}
ClassE.prototype = new ClassA("e");
ClassE.prototype.name = "ee";
ClassE.prototype.sayName = function(){
  alert(this.name);
}
var e = new ClassE();
/**
混合方式--对象冒充继承构造函数的属性,用原型链继承 prototype 对象的方法。
*/
function ClassF(sColor){
  ClassA.call(this, sColor);
}
ClassF.prototype.name = 'ff';
ClassF.prototype.sayName = function(){
  alert(this.name);
}
var f = new ClassF('f');
  </script>
  <input value="method" type="button" onclick="javascript:alert(typeof(null))">
  <input value="property" type="button" onclick="b.sayName();b.sayColor();alert(b.color)">
  <br/>
  <hr>
  <input value="method" type="button" onclick="alert(typeof(c.sayName));c.sayName();c.sayColor();">
  <input value="property" type="button" onclick="alert(c.color);alert(c.name);">
  <br/>
  <hr>
  <input value="method" type="button" onclick="alert(typeof(d.sayName));d.sayName();d.sayColor();">
  <input value="property" type="button" onclick="alert(d.color);alert(d.name);">
  <br/>
  <hr>
  <input value="method" type="button" onclick="alert(typeof(e.sayName));e.sayName();e.sayColor();">
  <input value="property" type="button" onclick="alert(e.color);alert(e.name);alert(e.age);">
  <br/>
  <hr>
  <input value="method" type="button" onclick="alert(typeof(f.sayName));f.sayName();f.sayColor();">
  <input value="property" type="button" onclick="alert(f.color);alert(f.name);">
  <br/>
  <hr>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-8 13:32 , Processed in 2.331035 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表