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 相关文章推荐
最近项目写了一些js,水平有待提高
Jan 31 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
Jun 11 Javascript
jquery的Tooltip插件 qtip使用详细说明
Sep 08 Javascript
jQuery文本框(input textare)事件绑定方法教程
Apr 24 Javascript
JavaScript开发人员的10个关键习惯小结
Dec 05 Javascript
js控制网页背景音乐播放与停止的方法
Feb 06 Javascript
详解AngularJS 路由 resolve用法
Apr 24 Javascript
Vue 2.0入门基础知识之内部指令详解
Oct 15 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
Aug 30 Javascript
VUE+node(express)实现前后端分离
Oct 13 Javascript
node.js中 redis 的安装和基本操作示例
Feb 10 Javascript
Vue中点击active并第一个默认选中功能的实现
Feb 24 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
FCKeditor的安装(PHP)
2007/01/13 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
28个JS验证函数收集
2010/03/02 Javascript
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
jQuery简单绑定单个事件的方法示例
2017/06/10 jQuery
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
react MPA 多页配置详解
2019/10/18 Javascript
javascript运行机制之执行顺序理解
2020/08/03 Javascript
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
浅析Python中的join()方法的使用
2015/05/19 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
Python模块相关知识点小结
2020/03/09 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
Python同时迭代多个序列的方法
2020/07/28 Python
python statsmodel的使用
2020/12/21 Python
C语言编程练习
2012/04/02 面试题
2015年读书月活动总结
2015/03/26 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python
Mysql案例刨析事务隔离级别
2021/09/25 MySQL
Android studio 简单计算器的编写
2022/05/20 Java/Android