关于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 相关文章推荐
破除一些网站复制、右键限制
Nov 04 Javascript
关于jquery input textare 事件绑定及用法学习
Apr 03 Javascript
json的定义、标准格式及json字符串检验
May 11 Javascript
2则自己编写的jQuery特效分享
Feb 26 Javascript
js基于setTimeout与setInterval实现多线程
Jun 17 Javascript
基于javascript实现的快速排序
Dec 02 Javascript
使用JavaScript进行表单校验功能
Aug 01 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
Sep 13 Javascript
js的对象与函数详解
Jan 21 Javascript
微信小程序实现工作时间段选择
Feb 15 Javascript
react中Suspense的使用详解
Sep 01 Javascript
JS数组索引检测中的数据类型问题详解
Jan 11 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
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
ajax 文件上传应用简单实现
2009/03/03 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
2011/09/05 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
JavaScript节点及列表操作实例小结
2015/08/05 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
setTimeout与setInterval的区别浅析
2019/03/23 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
vue h5移动端禁止缩放代码
2019/10/28 Javascript
微信小程序实现吸顶效果
2020/01/08 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
Python实现k-means算法
2018/02/23 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
出纳的岗位职责
2013/11/09 职场文书
法律专业应届生自荐信范文
2014/01/06 职场文书
三月雷锋月活动总结
2014/07/03 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
大学生年度个人总结
2015/02/15 职场文书
大学毕业生个人总结
2015/02/28 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL
element tree树形组件回显数据问题解决
2022/08/14 Javascript