js原型链与继承解析(初体验)


Posted in Javascript onMay 09, 2016

js原型链与继承解析(初体验)

首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询obj的原型,我们通过判断obj的原型是否与Object.prototype相等来证明是否存在obj的原型,答案返回true,所以存在。然后我们定义一个函数foo(),任何一个函数都有它的prototype对象,即函数的原型,我们可以在函数的原型上添加任意属性,之后通过new一个实例化的对象可以共享其属性(下面的两个例子会详细介绍)。

function foo(){}
foo.prototype.z = 3;
var obj = new foo();
obj.x=1;
obj.y=2;
obj.x //1
obj.y //2
obj.z //3
typeof obj.toString; //function
obj.valueOf(); // foo {x: 1, y: 2, z: 3}
obj.hasOwnProperty('z'); //false

js原型链与继承解析(初体验)

在这里,obj的原型(_proto_)指向foo函数的prototype属性,foo.prototype的原型指向Object.prototype,原型链的末端则为null,通过hasOwnProperty来查看z属性是否是obj上的,显示false,则obj上本没有z属性,但通过查找其原型链,发现在foo.prototype上有,所以obj.z=3,并且对于首例上obj.valueOf()以及toString都是Object.prototype上的,所以任何一个对象都有这两个属性,因为任何一个对象的原型都是Object.prototype.当然除了以下一个特例,

var obj2 = Object.create(null);obj2.valueOf(); //undefined

Object.create()为创建一个空对象,并且此对象的原型指向参数。下面一个综合实例向大家展示一下如何实现一个class来继承另外一个class

//声明一个构造函数Person
function Person(name,age){
  this.name = name;
  this.age = age;
}
Person.prototype.hi = function (){
  console.log('Hi,my name is ' + this.name +',my age is '+this.age);
};
Person.prototype.LEGS_NUM=2;
Person.prototype.ARMS_NUM=2;
Person.prototype.walk = function (){
  console.log(this.name+' is walking !');
};
function Student(name,age,classNum){
  Person.call(this,name,age);
  this.classNum = classNum;
}
//创建一个空对象
Student.prototype = Object.create(Person.prototype);
//constructor指定创建一个对象的函数。
Student.prototype.constructor = Student;
Student.prototype.hi = function (){
  console.log('Hi,my name is ' + this.name +',my age is '+this.age+' and my class is '+this.classNum);
};
Student.prototype.learns = function (sub){
  console.log(this.name+' is learning '+sub);
};
//实例化一个对象Bosn
var Bosn = new Student('bosn',27,'Class 3');
Bosn.hi(); //Hi,my name is bosn,my age is 27 and my class is Class 3
Bosn.LEGS_NUM; //2
Bosn.walk(); //bosn is walking !
Bosn.learns('Math'); //bosn is learning Math

js原型链与继承解析(初体验)

构造函数Person与Student的this指向实例化的对象(Bosn),并且此对象的原型指向构造器的prototype。

我们用Object.create()方法来创建一个空对象,此对象的原型事项Person.prototype,这样写的好处是我们可以在不影响Person.prototype属性的前提下可以自己创建Studnet.prototype的任意属性,并且可以继承Person.prototype上原有的属性,因为子类Student是继承基类Person的。如果直接写Person.prototype = Student.prototype,那他两同时指向一个对象,在给Student.prototype添加属性的同时,Person的原型链上也会增加同样的属性。

对于构造函数Student里面的call方法,里面的this指向新创建的Student的实例化的对象,并通过call来实现继承。

Student.prototype.constructor = Student,这句话的含义是指定Student为创建Student.prototype这个对象的函数,如果不写这句话,该对象的函数还是Person。

对于继承,一共有三种方式来实现,

function Person(name,age){
  this.name = name;
  this.age = age;
}
function Student(){

}
Student.prototype = Person.prototype; //1
Student.prototype = Object.create(Person.prototype); //2
Student.prototype = new Person(); //3

以上这篇js原型链与继承解析(初体验)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一些易混淆且不常用的属性,希望有用
Jan 29 Javascript
用javascript动态调整iframe高度的方法
Mar 06 Javascript
jQuery Dialog 弹出层对话框插件
Aug 09 Javascript
js/jQuery简单实现选项卡功能
Jan 02 Javascript
jquery实现浮动的侧栏实例
Jun 25 Javascript
快速学习JavaScript的6个思维技巧
Oct 13 Javascript
BootStrap Table 设置height表头与内容无法对齐的问题
Dec 28 Javascript
基于vue的fullpage.js单页滚动插件
Mar 20 Javascript
js拖动滑块和点击水波纹效果实例代码
Oct 16 Javascript
node.js的Express服务器基本使用教程
Jan 09 Javascript
基于vue实现圆形菜单栏组件
Jul 05 Javascript
JavaScript前后端JSON使用方法教程
Nov 23 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
May 09 #Javascript
jquery实现表格中点击相应行变色功能效果【实例代码】
May 09 #Javascript
JavaScript中的prototype原型学习指南
May 09 #Javascript
jQuery+CSS实现一个侧滑导航菜单代码
May 09 #Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
May 09 #Javascript
jQuery代码实现表格中点击相应行变色功能
May 09 #Javascript
AngularJS控制器继承自另一控制器
May 09 #Javascript
You might like
一篇有意思的技术文章php介绍篇
2010/10/26 PHP
PHP取进制余数函数代码
2012/01/19 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
漂亮的widgets,支持换肤和后期开发新皮肤
2007/04/23 Javascript
javascript 节点排序 2
2011/01/31 Javascript
使用原生javascript创建通用表单验证——更锋利的使用dom对象
2011/09/13 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
2015/01/07 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
js倒计时小实例(多次定时)
2016/12/08 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
jQuery实现简单弹幕制作
2020/12/10 jQuery
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
最小二乘法及其python实现详解
2020/02/24 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
如何填写个人简历自我评价
2013/12/10 职场文书
交通安全演讲稿
2014/01/07 职场文书
大学校运会广播稿
2014/02/03 职场文书
学习型班组申报材料
2014/05/31 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
2015年庆祝国庆节66周年演讲稿
2015/07/30 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js
在 SQL 语句中处理 NULL 值的方法
2021/06/07 SQL Server
centos8安装MongoDB的详细过程
2021/10/24 MongoDB