关于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 相关文章推荐
css把超出的部分显示为省略号的方法兼容火狐
Jul 23 Javascript
百度 popup.js 完美修正版非常的不错 脚本之家推荐
Apr 17 Javascript
extjs 学习笔记(一) 一些基础知识
Oct 13 Javascript
基于jquery的tab切换 js原理
Apr 01 Javascript
jquery ready()的几种实现方法小结
Jun 18 Javascript
多个datatable共存造成多个表格的checkbox都被选中
Jul 11 Javascript
JS获取各种宽度、高度的简单介绍
Dec 19 Javascript
jQuery仿京东商城楼梯式导航定位菜单
Jul 25 Javascript
vue 监听屏幕高度的实例
Sep 05 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
Nov 12 Javascript
Ant Design moment对象和字符串之间的相互转化教程
Oct 27 Javascript
JavaScript实现滚动加载更多
Dec 27 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生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
PHP源码分析之变量的存储过程分解
2014/07/03 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
javascript 最常用的10个自定义函数[推荐]
2009/12/26 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
javascript控制台详解
2015/06/25 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
详解vscode中vue代码颜色插件
2018/10/11 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
Python 基础教程之包和类的用法
2017/02/23 Python
python+selenium+autoit实现文件上传功能
2017/08/23 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
python实现统计代码行数的小工具
2019/09/19 Python
python中四舍五入的正确打开方式
2021/01/18 Python
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
公司成立感言
2014/01/11 职场文书
体育活动总结范文
2014/05/04 职场文书
工业设计专业自荐书
2014/06/05 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
出国签证在职证明范本
2014/11/24 职场文书
Vue2.0搭建脚手架
2022/03/13 Vue.js
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js