javascript 用函数实现继承详解


Posted in Javascript onMay 28, 2016

一、知识储备:

1、枚举属性名称的函数:

(1)for...in:可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承属性)

(2)Object.keys():返回数组(可枚举的自有属性)

(3)Object.getOwnPropertyNames():所有的自有属性

3、属性的特性:数据属性和存取器属性

(1)数据属性:可写(writable)  可枚举(enumerable)  可配置(configurable)  值(value)

数据属性只有一个简单的值;

(2)存取器属性: 写入(set)  读取(get)  可枚举(enumerable)  可配置(configurable)

存取器属性不可写(即没有writable特性)。

属性有set方法,那这个属性是可写的,有get方法,那这个属性就是可读的。

4、定义属性特性的方法:Object.defineProperty(对象,属性,描述符对象)

5、获取属性的描述符对象:Object.getOwnPropertyDescriptor(对象,属性)

二、示例

1、根据for...in的用法,我们可以写出模拟“继承”的方法:

<script type="text/javascript"> 
  var child={}; 
  var mother={ 
    name:"zhangzhiying", 
    lastAge:21, 
    sex:"女"
  }; 
  function extend(target,source){ 
  
for(var p in source){ 
    
target[p]=source[p]; 
  

} 
  

return target; 
  } 
  extend(child,mother); 
  console.log(child);   //<STRONG>Object {name: "zhangzhiying", lastAge: 21, sex: "女"}</STRONG> 
</script>

2、使用for in来循环遍历原型对象的属性,然后一一赋值给我们的空对象,从而实现了“继承”。这个思路很正确,下面我们来对以上示例进行改造:

<script type="text/javascript"> 
  var child={}; 
  var mother={ 
    name:"zhangzhiying", 
    lastAge:21, 
    <STRONG>set age(value){ 
      this.lastAge=value; 
    }, 
    get age(){ 
      return this.lastAge+1; 
    },</STRONG> 
    sex:"女"
  };<BR>
<STRONG> mother.age=15;</STRONG>    //有set方法,具有可写性 
  function extend(target,source){ 
  

for(var p in source){ 
    
target[p]=source[p]; 
  

} 
  

return target; 
  } 
  extend(child,mother); 
  console.log(child);  //<STRONG>Object {name: "zhangzhiying", lastAge: 15, age: 16, sex: "女"}</STRONG> 
</script>

可以看到代码中使用了一对set,get;其中age是一个存取器属性。

运行的结果:一个不包含set,get的普通对象。 

结论:for  in实现的“继承”不处理set和get ,它把存取器属性(age)转换为一个静态的数据属性。

3、给mother对象设置数据属性

<script type="text/javascript"> 
  var child={}; 
  var mother={ 
    name:"zhangzhiying", 
    lastAge:21, 
    set age(value){ 
      this.lastAge=value; 
    }, 
    get age(){ 
      return this.lastAge+1; 
    }, 
    sex:"女"
  }; 
  Object.defineProperty(mother,"lastAge",{writable:false}); //把lastAge设置成了不可写 
  mother.age=15;                       //设置无效,因为lastAge的值不变,所以lastAge+1不变,即age不变 
  function extend(target,source){ 
    for(var p in source){ 
    target[p]=source[p]; 
  } 
  return target; 
  } 
  extend(child,mother); 
  console.log(child);   //Object {name: "zhangzhiying", lastAge: 21, age: 22, sex: "女"} 
  child.lastAge=12;
//结果显示lastAge改变,说明child.lastAge没有“继承”到mother.lastAge的特性,我们再用getOwnPropertyDesriptor()方法确认一下<BR>

 console.log(Object.getO
<EM id=__mceDel></script> 
</EM>

结论:要实现继承,我们还需要解决的问题->“继承”属性特性。

4、完善版本 

<script type="text/javascript"> 
  var child={}; 
  var mother={ 
    name:"zhangzhiying", 
    lastAge:21, 
    set age(value){ 
      this.lastAge=value; 
    }, 
    get age(){ 
      return this.lastAge+1; 
    }, 
    sex:"女"
  }; 
  Object.defineProperty(mother,"lastAge",{writable:false}); 
  mother.age=15; 
  <SPAN style="COLOR: #333399"><STRONG>function extend(target,source){ 
    var names=Object.getOwnPropertyNames(source);  //获取所有的属性名 
    for(var i=0;i<names.length;i++){ 
      if(names[i] in target) continue;  //如果这个属性存在,就跳过(原型继承中,如果自有属性和原型对象的属性重名,保留自有属性) 
      var desc=Object.getOwnPropertyDescriptor(source,names[i]);  //获取mother属性的描述符对象(即属性特性的集合,es5中用描述符对象来表示) 
      Object.defineProperty(target,names[i],desc);  //将mother的描述符对象给child的属性定义 
    } 
    return target; 
  }</STRONG></SPAN> 
  extend(child,mother); 
  console.log(child); 
  child.lastAge=12; 
  console.log(Object.getOwnPropertyDescriptor(child,"lastAge")); 
  console.log(child); 
</script>

最后的结果:

javascript 用函数实现继承详解

可以明显看到三次的打印,child“继承”到了set和get,lastAge数值没发生变化,writable也是false了。 

总结:最近在看《javascript权威指南》,总结一点心得,有错误欢迎指正,共同学习进步~

以上这篇javascript 用函数实现继承详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jQuery的ajax功能实现web service的json转化
Aug 29 Javascript
简单的jquery拖拽排序效果实现代码
Sep 20 Javascript
通过js动态操作table(新增,删除相关列信息)
May 23 Javascript
javascript替换已有元素replaceChild()使用介绍
Apr 03 Javascript
在Ubuntu上安装最新版本的Node.js
Jul 14 Javascript
javascript中数组的定义及使用实例
Jan 21 Javascript
两种简单的跨域方法(jsonp、php)
Jan 02 Javascript
ie下js不执行的几种可能
Feb 28 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
js判断文件类型大小并给出提示的实现方法
Jan 03 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
Oct 26 Javascript
Vue项目利用axios请求接口下载excel
Nov 17 Vue.js
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
May 28 #Javascript
jQuery实现布局高宽自适应的简单实例
May 28 #Javascript
jquery mobile界面数据刷新的实现方法
May 28 #Javascript
jquery自适应布局的简单实例
May 28 #Javascript
JQuery Mobile 弹出式登录框的实现方法
May 28 #Javascript
jquery div模态窗口的简单实例
May 28 #Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
May 28 #Javascript
You might like
如何用php获取文件名后缀
2013/06/09 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
php源码的安装方法和实例
2019/09/26 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
javascript 二维数组的实现与应用
2010/03/16 Javascript
js 异步处理进度条
2010/04/01 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
浅析jQuery Mobile的初始化事件
2015/12/03 Javascript
jQuery中通过ajax的get()函数读取页面的方法
2016/02/29 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Python生成器定义与简单用法实例分析
2018/04/30 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
2018/05/31 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
Python 解析简单的XML数据
2020/07/24 Python
Python调用Redis的示例代码
2020/11/24 Python
HTTP状态码详解
2021/03/18 杂记
美国高档百货Nordstrom的折扣店:Nordstrom Rack
2017/11/13 全球购物
澳大利亚相机之家:Camera House
2017/11/30 全球购物
十八大报告观后感
2014/01/28 职场文书
党员评议自我评价
2015/03/03 职场文书
毕业论文答辩开场白
2015/05/27 职场文书
歌剧魅影观后感
2015/06/05 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers