关于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 showModalDialog,open取得父窗口的方法
Mar 10 Javascript
基于jQuery捕获超链接事件进行局部刷新代码
May 10 Javascript
Jquery实现自定义弹窗示例
Mar 12 Javascript
javascript的创建多行字符串的7种方法
Apr 29 Javascript
Nginx上传文件全部缓存解决方案
Aug 17 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
Oct 15 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
Oct 27 Javascript
vue-resource + json-server模拟数据的方法
Nov 02 Javascript
Angular2进阶之如何避免Dom误区
Apr 02 Javascript
Javascript通过控制类名更改样式
May 24 Javascript
Vue-CLI 项目在pycharm中配置方法
Aug 30 Javascript
JavaScript数组去重实现方法小结
Jan 17 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 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
PHP使用递归按层级查找数据的方法
2019/11/10 PHP
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
JS获取时间的方法
2015/01/21 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
JavaScrip关于创建常量的知识点
2017/12/07 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
Python中的列表知识点汇总
2015/04/14 Python
Python简单的制作图片验证码实例
2017/05/31 Python
python操作oracle的完整教程分享
2018/01/30 Python
python使用openpyxl库修改excel表格数据方法
2018/05/03 Python
python 字典中文key处理,读取,比较方法
2018/07/06 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
简单了解python的一些位运算技巧
2019/07/13 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
外企C语言笔试题
2013/11/10 面试题
信用社实习人员自我鉴定
2013/09/20 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
安踏广告词改编版
2014/03/21 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
辞职离别感言
2015/08/04 职场文书
初中班主任工作随笔
2015/08/15 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
Python使用scapy模块发包收包
2021/05/07 Python
在项目中使用redis做缓存的一些思路
2021/09/14 Redis