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的键盘控制事件说明
Apr 15 Javascript
动态表格Table类的实现
Aug 26 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
Apr 25 Javascript
Android中的jQuery:AQuery简介
May 06 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
Mar 14 Javascript
jquery无限级联下拉菜单简单实例演示
Nov 23 Javascript
jQuery实现底部浮动窗口效果
Sep 07 Javascript
JSON字符串和JSON对象相互转化实例详解
Jan 05 Javascript
vue登录注册及token验证实现代码
Dec 14 Javascript
create-react-app修改为多页面支持的方法
May 17 Javascript
JavaScript中的事件与异常捕获详析
Feb 24 Javascript
详解Vue中使用插槽(slot)、聚类插槽
Apr 12 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正则表达匹配中文问题分析小结
2012/03/25 PHP
thinkphp四种url访问方式详解
2014/11/28 PHP
php异常处理方法实例汇总
2015/06/24 PHP
php用户注册信息验证正则表达式
2015/11/12 PHP
值得分享的php+ajax实时聊天室
2016/07/20 PHP
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
详解node.js的http模块实例演示
2018/07/12 Javascript
微信小程序如何获取手机验证码
2018/11/04 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python重试装饰器示例
2014/02/11 Python
数据挖掘之Apriori算法详解和Python实现代码分享
2014/11/07 Python
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
python统计文本文件内单词数量的方法
2015/05/30 Python
Python基于有道实现英汉字典功能
2015/07/25 Python
python中PIL安装简单教程
2016/04/21 Python
关于Python如何避免循环导入问题详解
2017/09/14 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
2021/01/27 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
热情服务标语
2014/10/07 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
社区敬老月活动总结
2015/05/07 职场文书
2016中秋节问候语
2015/11/11 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang