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 相关文章推荐
Prototype使用指南之array.js
Jan 10 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
Sep 28 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
Sep 05 Javascript
javascript:void(0)使用探讨
Aug 27 Javascript
JavaScript中instanceof运算符的用法总结
Nov 19 Javascript
javascript实现dom元素可拖动
Mar 21 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
Jun 08 Javascript
Angular中$cacheFactory的作用和用法实例详解
Aug 19 Javascript
简易的JS计算器实现代码
Oct 18 Javascript
简单实现jquery焦点图
Dec 12 Javascript
npm 常用命令详解(小结)
Jan 17 Javascript
JS模拟实现京东快递单号查询
Nov 30 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
改进的IP计数器
2006/10/09 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
eclipse php wamp配置教程
2016/06/30 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
JavaScript多图片上传案例
2015/09/28 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
深入理解Node.js 事件循环和回调函数
2016/11/02 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
vue3.0 CLI - 2.1 -  component 组件入门教程
2018/09/14 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
[57:22]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第五场
2018/04/10 DOTA
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
Python greenlet和gevent使用代码示例解析
2020/04/01 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
装潢设计专业推荐信模板
2013/11/26 职场文书
伦敦奥运会口号
2014/06/13 职场文书
物业消防安全责任书
2014/07/23 职场文书
乡镇挂职心得体会
2014/09/04 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
Python Pygame实战在打砖块游戏的实现
2022/03/17 Python
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android