基于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 相关文章推荐
Prototype Hash对象 学习
Jul 19 Javascript
javascript setTimeout()传递函数参数(包括传递对象参数)
Apr 07 Javascript
JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结
Apr 13 Javascript
js简单设置与使用cookie的方法
Jan 22 Javascript
基于JS实现省市联动效果代码分享
Jun 06 Javascript
Bootstrap模态框禁用空白处点击关闭
Oct 20 Javascript
微信小程序之ES6与事项助手的功能实现
Nov 30 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
Sep 15 Javascript
vuejs router history 配置到iis的方法
Sep 20 Javascript
微信小程序HTTP接口请求封装的实现
Feb 21 Javascript
Vuex mutitons和actions初使用详解
Mar 04 Javascript
js实现选项卡效果
Mar 07 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
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
PHP INT类型在内存中占字节详解
2019/07/20 PHP
javascript 写类方式之六
2009/07/05 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
使用javascript实现简单的选项卡切换
2015/01/09 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
node.js中axios使用心得总结
2017/11/29 Javascript
基于vue 实现token验证的实例代码
2017/12/14 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
JS逻辑运算符短路操作实例分析
2018/07/09 Javascript
vue cli使用融云实现聊天功能的实例代码
2019/04/19 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
[02:36]DOTA2混沌骑士 英雄基础教程
2013/11/26 DOTA
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
详解python Todo清单实战
2018/11/01 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
Python调用飞书发送消息的示例
2020/11/10 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
十岁生日家长答谢词
2014/01/17 职场文书
机关节能减排实施方案
2014/03/17 职场文书
教师辞职信范文
2015/02/28 职场文书
工程技术员岗位职责
2015/04/11 职场文书
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python
Python中基础数据类型 set集合知识点总结
2021/08/02 Python