关于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 相关文章推荐
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
Nov 30 Javascript
js 去掉空格实例 Trim() LTrim() RTrim()
Jan 07 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
Aug 25 Javascript
深入理解React中es6创建组件this的方法
Aug 29 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
Aug 29 Javascript
jQuery判断是否存在滚动条的简单方法
Sep 17 Javascript
微信小程序 简单教程实例详解
Jan 13 Javascript
jQuery中DOM节点删除之empty与remove
Jan 20 Javascript
js实现下拉框效果(select)
Mar 28 Javascript
Angular4实现鼠标悬停3d倾斜效果
Oct 25 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
Oct 26 Javascript
解决vue-router 二级导航默认选中某一选项的问题
Nov 01 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数组应用之比较两个时间的相减排序
2008/08/18 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
javascript分页代码(当前页码居中)
2012/09/20 Javascript
JavaScript作用域链使用介绍
2013/08/29 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
js如何改变文章的字体大小
2016/01/08 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
vue跨域解决方法
2017/10/15 Javascript
vue服务端渲染缓存应用详解
2018/09/12 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
Python中bisect的用法
2014/09/23 Python
Django的数据模型访问多对多键值的方法
2015/07/21 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
python中返回矩阵的行列方法
2018/04/04 Python
tensorflow实现二维平面模拟三维数据教程
2020/02/11 Python
Python filter()及reduce()函数使用方法解析
2020/09/05 Python
HTML5为输入框添加语音输入功能的实现方法
2017/02/06 HTML / CSS
Nordgreen美国官网:在线购买极简主义斯堪的纳维亚手表
2019/07/24 全球购物
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
销售员个人求职的自我评价
2014/02/10 职场文书
车辆工程专业求职信
2014/04/28 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
环保建议书范文
2015/09/14 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android