关于javascript原型的修改与重写(覆盖)差别详解


Posted in Javascript onAugust 31, 2016

每个JavaScript函数都有prototype属性(javascript对象没有这个属性),这个属性引用了一个对象,这个对象就是原型对象。javascript允许我们修改这个原型对象。

修改有2种方式:

方式1:在原有的原型对象上增加属性或者方法

function Person()
{
}

Person.prototype.add = function(){
	alert(this.name);
};

Person.prototype.name = "aty";

var p1 = new Person();
p1.add();//aty

方式2:重写(覆盖)原型对象

function Person()
{
}

Person.prototype = {
	add : function(){
		alert(this.name);
	},
	name : "aty"
}



var p2 = new Person();
p2.add();//aty

可以看到上面这2种方式都可以修改原型,那他们的差别究竟是什么呢?到底哪种方式才是推荐的的做法呢?

function Person()
{
}

function Animal()
{

}

var person = new Person();
var animal = new Animal();

// 修改原型
Person.prototype.say = function(){
	alert("person");
}

// 修改原型
Animal.prototype = {
	say : function(){
		alert("person");
	}
}

person.say();//person
animal.say();//Uncaught TypeError: undefined is not a function

如果是先创建对象,然后再修改原型,那么如果采用方式1,已经创建的对象能够正确访问修改后的原型;如果采用方式2,已经创建的对象无法访问到修改后的原型。从这个角度来看,显然方式1比方式2更好。为什么会这样呢?

 

function Person()
{
}

function Animal()
{

}

var person = new Person();
var animal = new Animal();
alert(person.__proto__ === Person.prototype);//true
alert(animal.__proto__ === Animal.prototype);//true

// 修改原型
Person.prototype.say = function(){
	alert("person");
}

// 修改原型
Animal.prototype = {
	say : function(){
		alert("person");
	}
}

alert(person.__proto__ === Person.prototype);//true
alert(animal.__proto__ === Animal.prototype);//false

 很显然这与java中"修改引用"和"修改引用指向的对象"很相似,效果也是一样的。

以上这篇关于javascript原型的修改与重写(覆盖)差别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
xmlHTTP实例
Oct 24 Javascript
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
Apr 07 Javascript
JQuery Ajax 跨域访问的解决方案
Mar 12 Javascript
JavaScript 字符串处理函数使用小结
Dec 02 Javascript
根据选择不同的下拉值出现相对应的文本输入框
Aug 01 Javascript
关于JS 预解释的相关理解
Jun 28 Javascript
JavaScript第一篇之实现按钮全选、功能
Aug 21 Javascript
Vue.js学习之计算属性
Jan 22 Javascript
jquery分页插件pagination使用教程
Oct 23 jQuery
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
Apr 11 Javascript
Vue将页面导出为图片或者PDF
Aug 17 Javascript
js前端图片加载异常兜底方案
Jun 21 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
Aug 31 #Javascript
浅谈JavaScript 覆盖原型以及更改原型
Aug 31 #Javascript
javascript 将共享属性迁移到原型中去的实现方法
Aug 31 #Javascript
使用vue编写一个点击数字计时小游戏
Aug 31 #Javascript
原生js实现tab选项卡切换
Mar 23 #Javascript
jquery的checkbox,radio,select等方法小结
Aug 30 #Javascript
Javascript日期格式化format函数的使用方法
Aug 30 #Javascript
You might like
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
十天学会php之第一天
2006/10/09 PHP
php完全过滤HTML,JS,CSS等标签
2009/01/16 PHP
PHP扩展编写点滴 技巧收集
2010/03/09 PHP
PHP中Session引起的脚本阻塞问题解决办法
2014/04/08 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
捕获关闭窗口的脚本
2009/01/10 Javascript
js setattribute批量设置css样式
2009/11/26 Javascript
需要做特殊处理的DOM元素属性的访问
2010/11/05 Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
微信小程序实现发送验证码按钮效果
2018/12/20 Javascript
使用原生js编写一个简单的框选功能方法
2019/05/13 Javascript
关于layui toolbar和template的结合使用方法
2019/09/19 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
Pytorch释放显存占用方式
2020/01/13 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
Python中logger日志模块详解
2020/08/04 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
Python 实现微信自动回复的方法
2020/09/11 Python
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
英文自荐信格式
2013/11/28 职场文书
幼儿园新学期寄语
2014/01/18 职场文书
学校联谊活动方案
2014/02/15 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
百日安全生产活动总结
2014/07/05 职场文书
2014年少先队工作总结
2014/12/03 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书
配置nginx 重定向到系统维护页面
2021/06/08 Servers