理解js对象继承的N种模式


Posted in Javascript onJanuary 25, 2016

本文分享了js对象继承的N种模式,供大家参考。

一、原型链继承

function Person(){};

Person.prototype = {
  constructor: Person,
  name: "Oliver"
};
    
function People(){};

People.prototype = new Person();
People.prototype.constructor = People;
People.prototype.sayName = function(){
  return this.name;
};

var ins = new People();

console.log(ins.sayName());

二、借用构造函数(伪造对象,经典继承)

1、无参数

function SuperType(){
  this.color = ["red","yellow","white"];
}
function SubType(){
  SuperType.call(this);
}

var instance1 = new SubType();
var instance2 = new SubType();

instance1.color.pop();
console.log(instance1.color); //["red", "yellow"]
console.log(instance2.color); //["red", "yellow", "white"]

2、有参数

function SuperType(name){
  this.name = name;
  this.number = [21,32,14,1];
}
function SubType(name,age){
  SuperType.call(this,name);
  this.age = age;
}

var instance1 = new SubType("Oliver",18);
var instance2 = new SubType("Troy",24);

instance2.number.pop();

console.log(instance1.name + instance1.age + instance1.number); //Oliver1821,32,14,1
console.log(instance2.name + instance2.age + instance2.number); //Troy2421,32,14

三、组合继承(伪经典继承)

1、无参数

function SuperType(){
  this.color = ["red","yellow","white"];
}
SuperType.prototype.sayColor = function(){
  return this.color;
};

function SubType(){
  SuperType.call(this);
  this.number = 321;
}
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayNumber = function(){
  return this.number;
};

var instance1 = new SubType();
var instance2 = new SubType();

instance2.color.pop();
console.log(instance1.color + instance1.number); //red,yellow,white321
console.log(instance2.color + instance2.number); //red,yellow321

2、有参数

function SuperType(name){
  this.name = name;
  this.number = [32,1342,11,1];
}
SuperType.prototype.sayName = function(){
  return this.name;
};

function SubType(name,age){
  SuperType.call(this,name);
  this.age = age;
}
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
  return this.age;
};

var instance1 = new SubType("Oliver",18);
var instance2 = new SubType("Troy",24);

instance2.number.pop();
console.log(instance1.sayName() + instance1.sayAge() + instance1.number); //Oliver1832,1342,11,1
console.log(instance2.sayName() + instance2.sayAge() + instance2.number); //Troy2432,1342,11

三、寄生组合式继承(引用类型最理想的范式)

function inheritPrototype(subType,superType){
  var prototype = Object(superType.prototype);
  prototype.constructor = subType;
  subType.prototype = prototype;
}

function SuperType(name){
  this.name = name;
  this.number = [321,321,43];
}
SuperType.prototype.sayName = function(){
  return this.name;
};

function SubType(name,age){
  SuperType.call(this,name);
  this.age = age;
}
inheritPrototype(SubType,SuperType);
SubType.prototype.sayAge = function(){
  return this.age;
};

var instance1 = new SubType("Oliver",18);
var instance2 = new SubType("Troy",24);
instance2.number.pop();

console.log(instance1.sayName() + instance1.sayAge() + instance1.number); //Oliver18321,321,43
console.log(instance2.sayName() + instance2.sayAge() + instance2.number); //Troy24321,321

或者可以把inheritPrototype 函数写成下面这样:

function inheritPrototype(SubType,SuperType){
  SubType.prototype = new SuperType();
  SubType.prototype.constructor = SubType;
}

四、原型式继承(用于共享引用类型的值,与寄生式类似)

1、传统版(先定义object() 函数,再继承)

function object(o){
  function F(){};
  F.prototype = o;
  return new F();
}

var SuperType = {
  name: "Oliver",
  number: [321,321,4532,1]
};

var SubType1 = object(SuperType);
var SubType2 = object(SuperType);

SubType1.name = "Troy";
SubType1.number.pop();

SubType2.name = "Alice";
SubType2.number.pop();

console.log(SubType1.name + SubType2.name + SubType1.number + SubType2.number + SuperType.name + SuperType.number); //TroyAlice321,321321,321Oliver321,321

ECMAScript 5 版(直接用Object.create(),再继承)

var SuperType = {
  name: "Oliver",
  number: [321,321,4532,1]
};

var SubType1 = Object.create(SuperType); //省略了定义object()函数
var SubType2 = Object.create(SuperType);

SubType1.name = "Troy";
SubType1.number.pop();

SubType2.name = "Alice";
SubType2.number.pop();

console.log(SubType1.name + SubType2.name + SubType1.number + SubType2.number + SuperType.name + SuperType.number); //TroyAlice321,321321,321Oliver321,321

ECMAScript 5 简写版(定义Object.create()的第二个参数,再继承)

var SuperType = {
  name: "Oliver",
  number: [321,321,4532,1]
};

var SubType1 = Object.create(SuperType,{
  name: {
    value : "Troy"
  }
});
var SubType2 = Object.create(SuperType,{
  name: {
    value : "Alice"
  }
});

SubType1.number.pop();
SubType2.number.pop();

console.log(SubType1.name + SubType2.name + SubType1.number + SubType2.number + SuperType.name + SuperType.number); //TroyAlice321,321321,321Oliver321,321

寄生式继承(用于共享引用类型的值,与原型式类似)

function createAnother(original){
  var clone = Object(original);
  clone.sayHi = function(){
    return "Hi";
  };
  return clone;
}

var person = {
  name: "Oliver",
  number: [13,21,31,1]
};

var anotherPerson = createAnother(person);
anotherPerson.number.pop();

console.log(anotherPerson.sayHi() + anotherPerson.number); //Hi13,21,31
console.log(person.number); //13,21,31

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
分享14个很酷的jQuery导航菜单插件
Apr 25 Javascript
node.js中的fs.rename方法使用说明
Dec 16 Javascript
js模仿java的Map集合详解
Jan 06 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
Sep 06 Javascript
js实现开启密码大写提示
Dec 21 Javascript
js css3实现图片拖拽效果
Mar 04 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
Jul 20 Javascript
javascript实现数字配对游戏的实例讲解
Dec 14 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
Sep 24 Javascript
js实现时分秒倒计时
Dec 03 Javascript
js的Object.assign用法示例分析
Mar 05 Javascript
Vue实现图片轮播组件思路及实例解析
May 11 Javascript
解决js函数闭包内存泄露问题的办法
Jan 25 #Javascript
JavaScript数据类型学习笔记
Jan 25 #Javascript
分步解析JavaScript实现tab选项卡自动切换功能
Jan 25 #Javascript
jQuery form 表单验证插件(fieldValue)校验表单
Jan 24 #Javascript
Jquery实现纵向横向菜单
Jan 24 #Javascript
JavaScript、jQuery与Ajax的关系
Jan 24 #Javascript
JavaScript jquery及AJAX小结
Jan 24 #Javascript
You might like
php学习之数据类型之间的转换介绍
2011/06/09 PHP
laravel实现批量更新多条记录的方法示例
2017/10/22 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
JS自动适应的图片弹窗实例
2013/06/29 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
js实现将选中内容分享到新浪或腾讯微博
2015/12/16 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
javascript实现固定侧边栏
2021/02/09 Javascript
python中管道用法入门实例
2015/06/04 Python
python之PyMongo使用总结
2017/05/26 Python
Python实现的txt文件去重功能示例
2018/07/07 Python
TensorFlow实现简单的CNN的方法
2019/07/18 Python
Django forms表单 select下拉框的传值实例
2019/07/19 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
详解python中index()、find()方法
2019/08/29 Python
如何基于Python实现自动扫雷
2020/01/06 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
幼儿园园长自我鉴定
2013/10/22 职场文书
《小池塘》教学反思
2014/02/28 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
2014年工程部工作总结
2014/11/25 职场文书
党员个人总结范文
2015/02/14 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
贴吧吧主申请感言
2015/08/03 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
TS 类型兼容教程示例详解
2022/09/23 Javascript