关于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 相关文章推荐
js getElementsByTagName的简写方式
Jun 27 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
Jan 10 Javascript
浅析Cookie中的Path与domain
Dec 18 Javascript
js随机生成字母数字组合的字符串 随机动画数字
Sep 02 Javascript
js实现select下拉框菜单
Dec 08 Javascript
用JavaScript实现让浏览器停止载入页面的方法
Jan 19 Javascript
整理关于Bootstrap导航的慕课笔记
Mar 29 Javascript
在使用JSON格式处理数据时应该注意的问题小结
May 20 Javascript
js+html5实现手机九宫格密码解锁功能
Jul 30 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
Aug 30 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
Jan 07 Javascript
浅谈javascript事件环微任务和宏任务队列原理
Sep 12 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
php网站被挂木马后的修复方法总结
2014/11/06 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
php微信公众号开发模式详解
2016/11/28 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
2015/08/07 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
js实现图片加载淡入淡出效果
2017/04/07 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
一步步教会你微信小程序的登录鉴权
2018/04/09 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
在Vue 中使用Typescript的示例代码
2018/09/10 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
Element MessageBox弹框的具体使用
2020/07/27 Javascript
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
[05:31]DOTA2上海特级锦标赛主赛事第三日RECAP
2016/03/05 DOTA
Python 代码性能优化技巧分享
2012/08/07 Python
Python实现的批量下载RFC文档
2015/03/10 Python
深入理解Python中各种方法的运作原理
2015/06/15 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
python使用建议与技巧分享(二)
2020/08/17 Python
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
材料化学应届生求职信
2013/10/09 职场文书
小学母亲节活动方案
2014/03/14 职场文书
爱之链教学反思
2014/04/30 职场文书
化工专业自荐书
2014/06/16 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
四风问题对照检查材料思想汇报
2014/10/07 职场文书
公司人事管理制度
2015/08/05 职场文书
python超详细实现完整学生成绩管理系统
2022/03/17 Python
mysql中关键词exists的用法实例详解
2022/06/10 MySQL