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实现省市联动效果的简单实例
Feb 10 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
Sep 01 Javascript
基于jquery实现的树形菜单效果代码
Sep 06 Javascript
理解javascript中DOM事件
Dec 25 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
Jul 12 Javascript
request请求获取参数的实现方法(post和get两种方式)
Sep 27 Javascript
实例浅析js的this
Dec 11 Javascript
利用JavaScript如何查询某个值是否数组内
Jul 30 Javascript
js生成word中图片处理方法
Jan 06 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
Sep 25 Javascript
vue 实现一个简单的全局调用弹窗案例
Sep 10 Javascript
JavaScript实现简易计算器小功能
Oct 22 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中在数据库中保存Checkbox数据(1)
2006/10/09 PHP
十天学会php之第五天
2006/10/09 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
php使用fopen创建utf8编码文件的方法
2014/10/31 PHP
PHP+shell实现多线程的方法
2015/07/01 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
基于PHP实现通过照片获取ip地址
2016/04/26 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
PHP Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
Node.js异步I/O学习笔记
2014/11/04 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
jQuery实现web页面樱花坠落的特效
2017/06/01 jQuery
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
[01:33]真香警告!DOTA2勇士令状不朽珍藏Ⅱ饰品欣赏
2018/06/26 DOTA
简单谈谈python中的Queue与多进程
2016/08/25 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
python Tornado框架的使用示例
2020/10/19 Python
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
中学生爱国演讲稿
2013/12/31 职场文书
校园之声广播稿
2014/01/31 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
销售内勤岗位职责
2014/04/15 职场文书
2014年护士长工作总结
2014/11/11 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
《观察物体》教学反思
2016/02/17 职场文书
个人向公司借款协议书
2016/03/19 职场文书