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-简单的日历实现及Date对象语法介绍(附图)
May 30 Javascript
js复制到剪切板的实例方法
Jun 28 Javascript
JS对select控件option选项的增删改查示例代码
Oct 21 Javascript
推荐10个2014年最佳的jQuery视频插件
Nov 12 Javascript
JavaScript改变CSS样式的方法汇总
May 07 Javascript
js实现三张图(文)片一起切换的banner焦点图
Aug 25 Javascript
JS正则替换掉小括号及内容的方法
Nov 29 Javascript
手机软键盘弹出时影响布局的解决方法
Dec 15 Javascript
ajax实现动态下拉框示例
Jan 10 Javascript
node.js操作mongodb简单示例分享
May 25 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
Jun 10 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
Sep 06 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程序中的常见漏洞进行攻击
2006/10/09 PHP
解析PHP中intval()等int转换时的意外异常情况
2013/06/21 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
php生成动态验证码gif图片
2015/10/19 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
JSON对象 详解及实例代码
2016/10/18 Javascript
React组件生命周期详解
2017/07/03 Javascript
Angular中自定义Debounce Click指令防止重复点击
2017/07/26 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
2019/11/01 Javascript
node静态服务器实现静态读取文件或文件夹
2019/12/03 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
vue实现拖拽进度条
2021/03/01 Vue.js
python调用新浪微博API项目实践
2014/07/28 Python
在Django的模板中使用认证数据的方法
2015/07/23 Python
python装饰器深入学习
2018/04/06 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
阿联酋团购网站:Groupon阿联酋
2016/10/14 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
建筑文秘专业个人求职信范文
2013/12/28 职场文书
环保项目建议书
2014/08/26 职场文书
纪律教育学习月活动总结
2014/08/27 职场文书
授权委托书协议书
2014/10/16 职场文书
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
人与自然的观后感
2015/06/18 职场文书
PHP中多字节字符串操作实例详解
2021/08/23 PHP