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 相关文章推荐
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
Feb 23 Javascript
原生js实现跨浏览器获取鼠标按键的值
Apr 08 Javascript
javascript 上下banner替换具体实现
Nov 14 Javascript
解决jquery无法找到其他父级子集问题的方法
May 10 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
Aug 16 Javascript
JS实现的全排列组合算法示例
Oct 09 Javascript
vue计算属性及使用详解
Apr 02 Javascript
vue 组件中slot插口的具体用法
Apr 03 Javascript
浅谈vue3中effect与computed的亲密关系
Oct 10 Javascript
vue下axios拦截器token刷新机制的实例代码
Jan 17 Javascript
用JS实现选项卡
Mar 23 Javascript
Vue中正确使用Element-UI组件的方法实例
Oct 13 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数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
zend Framework中的Layout(模块化得布局)详解
2013/06/28 PHP
php遍历目录方法小结
2015/03/10 PHP
php 类自动载入的方法
2015/06/03 PHP
javascript 在网页中的运用(asp.net)
2009/11/23 Javascript
javascript textContent与innerText的异同分析
2010/10/22 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
jQuery仿Excel表格编辑功能的实现代码
2013/05/01 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
Vue.js每天必学之方法与事件处理器
2016/09/06 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
node文件批量重命名的方法示例
2017/10/23 Javascript
MVVM框架下实现分页功能示例
2018/06/14 Javascript
Node.js log4js日志管理详解
2018/07/31 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
Python多线程和队列操作实例
2015/06/21 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
2020/07/13 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
C#笔试题
2015/07/14 面试题
技校生自我鉴定范文
2013/09/26 职场文书
小学生期末自我鉴定
2014/01/19 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
三方股东合作协议书
2014/10/28 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang