浅谈javascript原型链与继承


Posted in Javascript onJuly 13, 2015

js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解。

浅谈javascript原型链与继承

      首先定义一个对象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

浅谈javascript原型链与继承

在这里,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

浅谈javascript原型链与继承

构造函数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

第一种,刚刚在上面已经说过了,直接这样写会让子类和基类同时指向bosn实例;

第二种,恰到好处的避开这一点,并很好地实现继承,让实例先查询子类,若没有相应属性,再查询基类;

第三种,虽然也实现了继承,但调用了Person这个构造函数,这个例子中此构造函数有两个参数name和age,但这第三种什么也没有传,并没有实例化。

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
JAVASCRIPT  THIS详解 面向对象
Mar 25 Javascript
仅用[]()+!等符号就足以实现几乎任意Javascript代码
Mar 01 Javascript
js获取单元格自定义属性值的代码(IE/Firefox)
Apr 05 Javascript
JavaScript调用Activex控件的事件的实现方法
Apr 11 Javascript
Javascript 倒计时源代码.(时.分.秒) 详细注释版
May 09 Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
Dec 27 Javascript
jquery+easeing实现仿flash的载入动画
Mar 10 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
Dec 08 Javascript
vue 的点击事件获取当前点击的元素方法
Sep 15 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
Nov 07 Javascript
详解Vue前端对axios的封装和使用
Apr 01 Javascript
微信小程序与公众号实现数据互通的方法
Jul 25 Javascript
jQuery实现自定义checkbox和radio样式
Jul 13 #Javascript
javascript作用域问题实例分析
Jul 13 #Javascript
javascript中使用正则表达式清理table样式的代码
Apr 01 #Javascript
jquery实现图片上传之前预览的方法
Jul 11 #Javascript
JavaScript使用RegExp进行正则匹配的方法
Jul 11 #Javascript
javascript中JSON对象与JSON字符串相互转换实例
Jul 11 #Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
Jul 10 #Javascript
You might like
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
JQuery与JSon实现的无刷新分页代码
2011/09/13 Javascript
angular.bind使用心得
2015/10/26 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
2017/02/18 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
vue后台管理之动态加载路由的方法
2018/08/13 Javascript
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
便捷提取python导入包的属性方法
2018/10/15 Python
举例讲解Python常用模块
2019/03/08 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
python字典与json转换的方法总结
2020/12/28 Python
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
美国创意之家:BulbHead
2017/07/12 全球购物
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
酒店秘书求职信范文
2014/02/17 职场文书
目标责任书格式
2014/07/28 职场文书
个人授权委托书模板
2014/09/14 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
党员对十八届四中全会的期盼思想汇报范文
2014/10/17 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
新闻稿格式范文
2015/07/18 职场文书
幼儿园教师教学反思
2016/03/02 职场文书
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android
Windows Server 2012 修改远程默认端口3389的方法
2022/04/28 Servers