基于js中的原型、继承的一些想法


Posted in Javascript onAugust 10, 2016

最近看到一个别人写的js类库,突然对js中的原型及继承产生了一些想法,之前也看过其中的一些内容,但是总不是很清晰,这几天利用空闲时间,对这块理解了一下,感觉还是有不通之处,思路上没那么条理,仅作为分享,

一、instanceof

在JavaScript有instanceof运算符,是二元运算符,使用方法 instanceA instanceof A,返回值是布尔值(boolean),含义是判断instanceA是否是A的一个实例,其实质是判断A.prototype===instanceA.__proto__,如

function f2(){
  var f=function(){}
  var test=new f();
  console.log(test instanceof f);//true
  console.log((f.prototype===test.__proto__));//true
}

上边的两个打印都是true。说明test是f的一个实例;test的__proto__属性指向了f的prototype对象,即f的prototype属性是一个对象,且此对象是f的一个实例。

二、js中对象

在js中一切皆是对象,对象分为函数对象和普通对象,常用的函数其实是函数对象,如

//函数对象
  var f=function(){}
  var f2=new Function('str','console.log(str)')
  function f3(){}
  //普通对象
  var o=new Object();
  var o2={}
  var o3=new f()

上面看到f、f2、f3是函数对象,o、o2、o3是普通对象。

函数对象和普通对象的区别:

所有使用new Function()的方式创建的对象都是函数对象,f和f3两种方式,最终是也是使用new Function()方式创建的;

在定义一个对象时,对象中包含一些预定义的属性,如,prototype、__proto__,其中prototype属性只有函数对象才有,__proto__则是对所有的对象都有,所以可以通过对象的__proto__属性判断一个对象是函数对象还是普通对象,如

//函数对象
  var f=function(){}
  //普通对象
  var o=new Object();
  console.log(f.prototype);//Object {}
  console.log(o.prototype);//undefined

从上边可以得出函数对象存在prototype属性,而普通对象的prototype对象则是未定义。

三、原型链

从上边知道所有的对象都有一个__proto__属性,这个属性指向创建它的函数对象的原型对象prototype,我们把这种使用__proto__属性串起来的链叫做原型链,如下面是一个原型链,

基于js中的原型、继承的一些想法

上图,以person为例,说明原型链,

var person=function(){}
var person1=new person();

1、person是一个函数对象,person1是person的一个实例

2、person1的__proto__属性是person的原型对象person.prototype

3、由于person的原型对象person.prototype是一个对象,它也有一个__proto__属性,这个属性指向的Object的原型对象Object.prototype

4、Object的原型对象Object.prototype是一个对象,它也有一个__proto__属性,这个属性的原型对象为null。

四、一些继承

在js中我们会定义一个函数对象,如

var person=function(){}

上面我们定义了一个函数对象,它没有任何的属性,是一个空对象,由于它是一个对象,所以可以为它增加属性,

var person=function(){}
person.name1='js'
console.log(person.name1)//js

上面的代码为person新增了一个name属性,且赋值为js,且可以打印出name属性的值
但是当我们创建一个person的实例person1的时候,如下

var person= function(){};
  person.name1= 122;
  console.log(person.name1);
  var person1=new person();
  console.log(person1.name1);//undefined

可以看到person1没有name1这个属性,那么如何才能保证person的实例也有name1属性呢,

var person= function(){};
  person.name1= 122;
  //使用prototype对象为对象添加属性,这样所以的实例都会有此属性
  person.prototype.name1='12';
  console.log(person.name1);
  var person1=new person();
  console.log(person1.name1);//12

上面,使用了person.protoype.name1='12',这样所有的实例都有了name1属性,使用这种方式添加的属性,在生成实例的时候会把属性当作实例的共有属性。

以上这篇基于js中的原型、继承的一些想法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript:void(0)的真正含义实例分析
Aug 20 Javascript
JavaScript中各种编码解码函数的区别和注意事项
Aug 19 Javascript
深入理解Javascript闭包 新手版
Dec 28 Javascript
让图片旋转任意角度及JQuery插件使用介绍
Mar 20 Javascript
JS实现侧悬浮浮动实例代码
Nov 29 Javascript
第二篇Bootstrap起步
Jun 21 Javascript
原生JS实现的放大镜效果实例代码
Oct 15 Javascript
js 转义字符及URI编码详解
Feb 28 Javascript
JavaScript Uploadify文件上传实例
Feb 28 Javascript
详解webpack和webpack-simple中如何引入css文件
Jun 28 Javascript
vue-router 导航钩子的具体使用方法
Aug 31 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
Aug 21 Javascript
新入门node.js必须要知道的概念(必看篇)
Aug 10 #Javascript
jQuery制作圣诞主题页面 更像是爱情影集
Aug 10 #Javascript
jquery实现拖动效果
Aug 10 #Javascript
JS弹出新窗口被拦截的解决方法
Aug 09 #Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
Aug 09 #Javascript
JS获取一个未知DIV高度的方法
Aug 09 #Javascript
Bootstrap实现带动画过渡的弹出框
Aug 09 #Javascript
You might like
ThinkPHP中order()使用方法详解
2016/04/19 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
浅析javascript 定时器
2014/12/23 Javascript
JS实现超简单的仿QQ折叠菜单效果
2015/09/21 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
微信小程序template模板实例详解
2017/10/27 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
vue 解决遍历对象显示的顺序不对问题
2019/11/07 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
详解JS函数防抖
2020/06/05 Javascript
[46:50]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python可视化实现代码
2019/01/15 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
django中嵌套的try-except实例
2020/05/21 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
航空大学应届生求职信
2013/11/10 职场文书
工作交流会欢迎词
2014/01/12 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers