关于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 相关文章推荐
文本框的字数限制功能jquery插件
Nov 24 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
Nov 14 Javascript
HTML5附件拖拽上传drop & google.gears实现代码
Apr 28 Javascript
jQuery代码优化之基本事件
Nov 01 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
Jul 08 Javascript
Bootstrap标签页(Tab)插件使用方法
Mar 21 Javascript
微信小程序开发中的疑问解答汇总
Jul 03 Javascript
Vue编程式跳转的实例代码详解
Jul 10 Javascript
vue中进行微博分享的实例讲解
Oct 14 Javascript
JS实现网站吸顶条
Jan 08 Javascript
原生JS利用transform实现banner的无限滚动示例代码
Jun 15 Javascript
vue+element UI实现树形表格
Dec 29 Vue.js
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/03/21 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
JS声明变量背后的编译原理剖析
2012/12/28 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
深入讲解AngularJS中的自定义指令的使用
2015/06/18 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
node.js入门学习之url模块
2017/02/25 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
使用Vue构建可重用的分页组件
2018/03/26 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
Python连接DB2数据库
2016/08/27 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
flask框架url与重定向操作实例详解
2020/01/25 Python
scrapy处理python爬虫调度详解
2020/11/23 Python
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
香港交友网站:be2香港
2018/07/22 全球购物
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
英国珠宝网站Argento: PANDORA、Olivia Burton和Nomination等
2020/05/08 全球购物
如何将整数int转换成字串String
2014/03/21 面试题
中学校庆方案
2014/03/17 职场文书
四年级数学上册教学计划
2015/01/20 职场文书
python实现大文本文件分割成多个小文件
2021/04/20 Python