基于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表单验证 - Parsley.js使用和配置
Jan 25 Javascript
在子窗口中关闭父窗口的一句代码
Oct 21 Javascript
jquery+javascript编写国籍控件
Feb 12 Javascript
node.js操作mongodb学习小结
Apr 25 Javascript
Javascript typeof与instanceof的区别
Oct 18 Javascript
js date 格式化
Feb 15 Javascript
JS获取短信验证码倒计时的实现代码
May 22 Javascript
基于easyui checkbox 的一些操作处理方法
Jul 10 Javascript
原生JS实现的轮播图功能详解
Aug 06 Javascript
vue3实现v-model原理详解
Oct 09 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
Nov 05 Javascript
react合成事件与原生事件的相关理解
May 13 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
用PHP实现多级树型菜单
2006/10/09 PHP
php 中的str_replace 函数总结
2007/04/27 PHP
php强制运行广告的方法
2014/12/01 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
JavaScript打字小游戏代码
2011/12/26 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
vue eslint简要配置教程详解
2019/07/26 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
详解Python中用于计算指数的exp()方法
2015/05/14 Python
对python文件读写的缓冲行为详解
2019/02/13 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
2020/02/27 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
Html5如何唤起百度地图App的方法
2019/01/27 HTML / CSS
结构和类有什么异同
2012/07/16 面试题
Prototype如何更新局部页面
2013/03/03 面试题
手机被没收检讨书
2014/02/22 职场文书
优秀员工推荐材料
2014/12/20 职场文书
施工安全员岗位职责
2015/04/11 职场文书
记者节感言
2015/08/03 职场文书
业务员管理制度范本
2015/08/06 职场文书
企业安全生产检查制度
2015/08/06 职场文书
情感电台广播稿
2015/08/18 职场文书
2016年寒假社会实践活动心得体会
2015/10/09 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
导游词之上海豫园
2019/10/24 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
Mysql binlog日志文件过大的解决
2021/10/05 MySQL
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL