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 刷新全集常用代码
Nov 22 Javascript
JSQL 批量图片切换的实现代码
May 05 Javascript
EasyUI中combobox默认值注意事项
Mar 01 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
May 09 Javascript
JavaScript数据结构之二叉树的遍历算法示例
Apr 13 Javascript
修改node.js默认的npm安装目录实例
May 15 Javascript
详解ES6 系列之异步处理实战
Oct 26 Javascript
JavaScript创建防篡改对象的方法分析
Dec 30 Javascript
Javascript幻灯片播放功能实现过程解析
May 07 Javascript
vue 实现锚点功能操作
Aug 10 Javascript
JS实现超级好看的鼠标小尾巴特效
Dec 01 Javascript
JS继承最简单的理解方式
Mar 31 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截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
JavaScript关于select的相关操作说明
2010/01/13 Javascript
对js关键字命名的疑问介绍
2014/04/25 Javascript
浅谈js中的闭包
2015/03/16 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
详解AngularJS中的filter过滤器用法
2016/01/04 Javascript
简单易懂的天气插件(代码分享)
2017/02/04 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
js实现按座位号抽奖
2017/04/05 Javascript
Vue.js实现输入框绑定的实例代码
2017/08/24 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
jQuery中的for循环var与let的区别
2018/04/21 jQuery
tsconfig.json配置详解
2019/05/17 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
Python基于twisted实现简单的web服务器
2014/09/29 Python
python中lambda与def用法对比实例分析
2015/04/30 Python
深入解读Python解析XML的几种方式
2016/02/16 Python
老生常谈Python序列化和反序列化
2017/06/28 Python
查看django执行的sql语句及消耗时间的两种方法
2018/05/29 Python
python 将print输出的内容保存到txt文件中
2018/07/17 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
Python中如何引入第三方模块
2020/05/27 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
学生出入校管理制度
2014/01/16 职场文书
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
同学会主持词
2014/03/18 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
信用卡工资证明范本
2014/10/17 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
超搞笑婚前保证书
2015/05/08 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书