关于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字符编码函数区别分析
Jun 05 Javascript
js cookies 常见网页木马挂马代码 24小时只加载一次
Apr 13 Javascript
实现JavaScript中继承的三种方式
Oct 16 Javascript
关于URL中的特殊符号使用介绍
Nov 03 Javascript
JQuery循环滚动图片代码
Dec 08 Javascript
JQuery学习笔录 简单的JQuery
Apr 09 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
Oct 28 Javascript
jquery禁止回车触发表单提交
Dec 12 Javascript
JavaScript 性能优化小结
Oct 12 Javascript
js防阻塞加载的实现方法
Sep 09 Javascript
Javascript数组中push方法用法分析
Oct 31 Javascript
JS实现数组去重方法总结(六种方法)
Jul 14 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动态生成JavaScript代码
2009/03/09 PHP
php文本转图片自动换行的方法
2013/03/13 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
2014过年倒计时示例
2014/01/31 PHP
php 中奖概率算法实现代码
2017/01/25 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
2016/09/24 Javascript
Bootstrap CSS组件之输入框组
2016/12/17 Javascript
Bootstrap笔记—折叠实例代码
2017/03/13 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
详解Python发送邮件实例
2016/01/10 Python
python开发简易版在线音乐播放器
2017/03/03 Python
python版简单工厂模式
2017/10/16 Python
Python中的defaultdict与__missing__()使用介绍
2018/02/03 Python
pygame游戏之旅 python和pygame安装教程
2018/11/20 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
Python调用Windows命令打印文件
2020/02/07 Python
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
《赶海》教学反思
2014/04/20 职场文书
廉洁教育学习材料
2014/05/19 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
电大奖学金获奖感言
2014/08/14 职场文书
2015感人爱情寄语
2015/02/26 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android
Python编程super应用场景及示例解析
2021/10/05 Python