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跑马灯代码(自写)
Apr 17 Javascript
javascript实现Table排序的方法
May 15 Javascript
jquery实现弹出层效果实例
May 19 Javascript
JS产生随机数的几个用法详解
Jun 22 Javascript
jQuery可见性过滤选择器用法示例
Sep 09 Javascript
原生js实现轮播图
Feb 27 Javascript
浅谈ES6 模板字符串的具体使用方法
Nov 07 Javascript
图片懒加载imgLazyLoading.js使用详解
Sep 15 Javascript
Vue 进阶之路(三)
Apr 18 Javascript
vue h5移动端禁止缩放代码
Oct 28 Javascript
微信小程序如何加载数据库真实数据的实现
Mar 04 Javascript
javascript实现点击按钮切换轮播图功能
Sep 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执行速度全攻略(下)
2006/10/09 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
JavaScript窗口功能指南之在窗口中书写内容
2006/07/21 Javascript
浅谈javascript 面向对象编程
2009/10/28 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
javascript操作cookie
2017/01/17 Javascript
支持移动端原生js轮播图
2017/02/16 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
2018/05/04 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
python 远程统计文件代码分享
2015/05/14 Python
Flask框架信号用法实例分析
2018/07/24 Python
Python 监测文件是否更新的方法
2019/06/10 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
如何将json数据转换为python数据
2020/09/04 Python
python的数学算法函数及公式用法
2020/11/18 Python
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
Android面试宝典
2013/08/06 面试题
人力资源管理专业应届生求职信
2013/09/28 职场文书
研究生自我鉴定范文
2013/10/30 职场文书
高中生期末评语大全
2014/01/28 职场文书
心理健康课教学反思
2014/02/13 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle
Mysql开启外网访问
2022/05/15 MySQL
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js