今天即兴研究了下JS,查阅了相关资料 ,发现Js中没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的"原型链"(prototype chain)模式,来实现继承。下面大概介绍一下Js中五种继承模式!

1、构造函数绑定:使用apply或是call

 function Animal() {
this.species = "动物";
} function Cat(name, color) {
//Animal.apply(this, arguments);
//Animal.call(this);
this.color = color;
this.name = name;
} var cat1 = new Cat("cat1", "white");
alert(cat1.species);

 2、prototype模式

      Cat.prototype = new Animal();
//任何一个prototype对象都有一个constructor属性,指向它的构造函数.
Cat.prototype.constructor = Cat;
var cat1 = new Cat("大毛", "黄色");
alert(cat1.species); // 动物 //直接继承prototype 优点是效率比较高(不用执行和建立Animal的实例了),比较省内存。缺点是 Cat.prototype和Animal.prototype现在指向了同一个对象,那么任何对
     Cat.prototype的修改,都会反映到Animal.prototype。
function Animal() { }
Animal.prototype.species = "动物";
Cat.prototype = Animal.prototype;
Cat.prototype.constructor = Cat;

3、利用空对象作为中介  F是空对象,所以几乎不占内存。这时,修改Cat的prototype对象,就不会影响到Animal的prototype对象。

   var F = function () { };
F.prototype = Animal.prototype;
Cat.prototype = new F();
Cat.prototype.constructor = Cat; //对上面封装
function extend(Child, Parent) {
var F = function () { };
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.uber = Parent.prototype; //可以直接调用父对象的方法
} extend(Cat, Animal);
var cat1 = new Cat("大毛", "黄色");
alert(cat1.species); // 动物

4、拷贝继承

  function extend2(Child, Parent) {
var p = Parent.prototype;
var c = Child.prototype;
for (var i in p) {
c[i] = p[i];
}
c.uber = p;
}

5、 原型式继承

 //clone()函数用来创建新的类Person对象
var clone = function (obj) {
var _f = function () {
};
//这句是原型式继承最核心的地方,函数的原型对象为对象字面量
_f.prototype = obj;
return new _f;
};
//先声明一个对象字面量 var Person = {
name: 'Darren',
getName: function () {
return this.name;
}
};
//不需要定义一个Person的子类,只要执行一次克隆即可
var Programmer = clone(Person);
//可以直接获得Person提供的默认值,也可以添加或者修改属性和方法
alert(Programmer.getName());
Programmer.name = 'Darren2';
alert(Programmer.getName());
//声明子类,执行一次克隆即可
var Someone = clone(Programmer);

初步接触Javascript感觉挺简单,可是当我慢慢的深入其中,发现Javascript其实也是一门很复杂的语言!只有慢慢的深入了!

最新文章

  1. i春秋url地址编码问题
  2. GacUI学习(一)
  3. [poj2411] Mondriaan's Dream (状压DP)
  4. dom自定义属性 兼容 index值获取
  5. linux安全体系
  6. php与mysql的链接到底用mysql 还是mysqli,pdo
  7. Win32中常用消息
  8. 配置SAP 采购合同审批
  9. Android DrawerLayout 抽屉
  10. ubuntu 安装chrome浏览器
  11. Django的url使用方法
  12. ListView之侧滑删除
  13. C#设计模式(4)——抽象工厂模式(Abstract Factory)
  14. linux 查看cpu的使用百分比
  15. Python 中常见错误总结
  16. vc让界面保持最上层
  17. curl java 模拟http请求
  18. 在ROS中使用QT界面
  19. 设计模式-单例模式(Singleton Pattren)(饿汉模式和懒汉模式)
  20. 解决ora-01034和ora-27101错误

热门文章

  1. 服务器出现大量close_wait,我们来说说到底是怎么回事?(以tomcat为例)
  2. Cocos 2d-X Lua游戏开发Mac环境搭建以及一点点感悟
  3. Careercup | Chapter 1
  4. 立即执行函数(IIFE)
  5. luogu P2744 [USACO5.3]量取牛奶Milk Measuring
  6. Storyboards Tutorial 01
  7. 在网页中插入flash播放器,播放flv视频
  8. vps
  9. yii2操作数据库 mysql 读写分离 主从复制
  10. AngularJS的过滤器示例