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 相关文章推荐
用函数式编程技术编写优美的 JavaScript_ibm
May 16 Javascript
JavaScript与DOM组合动态创建表格实例
Dec 23 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
Sep 04 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
Dec 02 Javascript
浅谈Sublime Text 3运行JavaScript控制台
Jun 06 Javascript
jquery判断iPhone、Android设备类型
Sep 14 Javascript
jQuery插件ajaxFileUpload异步上传文件
Oct 19 Javascript
微信小程序 textarea 组件详解及简单实例
Jan 10 Javascript
angularjs实现的前端分页控件示例
Feb 10 Javascript
JavaScript函数绑定用法实例分析
Nov 14 Javascript
mint-ui 时间插件使用及获取选择值的方法
Feb 09 Javascript
vue中keep-alive、activated的探讨和使用详解
Jul 26 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
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
php的curl实现get和post的代码
2008/08/23 PHP
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
浅谈php扩展imagick
2014/06/02 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
如何在PHP中生成随机数
2020/06/04 PHP
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
jquery attr 设定src中含有&(宏)符号问题的解决方法
2011/07/26 Javascript
JavaScript操作XML 使用百度RSS作为新闻源示例
2012/02/17 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
2013/02/04 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
jQuery插件开发的两种方法及$.fn.extend的详解
2014/01/16 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
2016/01/21 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
2017/01/19 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
2017/09/22 Javascript
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
在Django框架中运行Python应用全攻略
2015/07/17 Python
win10系统中安装scrapy-1.1
2016/07/03 Python
树莓派采用socket方式文件传输(python)
2019/06/22 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
Gretna Green中文官网:苏格兰格林小镇
2019/10/16 全球购物
ajax是什么及其工作原理
2012/02/08 面试题
护理学毕业生求职信
2013/11/14 职场文书
移风易俗倡议书
2014/04/15 职场文书
教师业务学习材料
2014/12/16 职场文书