关于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 相关文章推荐
弹出广告特效代码(一个IP只弹出一次)
May 11 Javascript
JQuery1.6 使用方法三
Nov 23 Javascript
基于Jquery实现的一个图片滚动切换
Jun 21 Javascript
javascript图像处理—仿射变换深度理解
Jan 16 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
Apr 28 Javascript
JS 实现Table相同行的单元格自动合并示例代码
Aug 27 Javascript
jquery 添加节点的几种方法介绍
Sep 04 Javascript
node+vue实现用户注册和头像上传的实例代码
Jul 20 Javascript
关于vue的语法规则检测报错问题的解决
May 21 Javascript
js实现input密码框显示/隐藏功能
Sep 10 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
Jul 19 Javascript
vue项目引入ts步骤(小结)
Oct 31 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
初学者入门:细述PHP4的核心Zend
2006/09/05 PHP
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
php数组去重的函数代码
2013/02/03 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
php  单例模式详细介绍及实现源码
2016/11/05 PHP
多广告投放代码 推荐
2006/11/13 Javascript
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
JavaScript伸缩的菜单简单示例
2013/12/03 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
Vue ​v-model相关知识总结
2021/01/28 Vue.js
[32:07]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第一场 12.16
2020/12/17 DOTA
Python计算程序运行时间的方法
2014/12/13 Python
python中实现字符串翻转的方法
2018/07/11 Python
python selenium 获取接口数据的实现
2020/12/07 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
讲文明树新风公益广告宣传方案
2014/02/25 职场文书
晚会闭幕词
2015/01/28 职场文书
出生证明范本
2015/06/15 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
SpringBoot集成Redis,并自定义对象序列化操作
2021/06/22 Java/Android
Python超详细分步解析随机漫步
2022/03/17 Python