详谈js原型继承的一些问题


Posted in Javascript onSeptember 06, 2017

当我们使用原型链继承时,需要谨慎的定义原型上的方法和属性,因为这可能带来意外的结果。

一、谨慎的定义原型上的方法。

当我们想为一个构造函数的原型上定义一个方法时,一定要在更改原型后再定义,否则新的原型对象上不会有定义的这个方法,导致与我们预期的结果不同。例:

function superObj(){}
superObj.prototype.sayHi=function sayHi(){
  console.log('hi');
};
superObj.prototype={
  name:'Poly'
};
var obj=new superObj();
obj.sayHi();//报错!! superObj.sayHi is not a function

正确操作如下

function superObj(){}
superObj.prototype={
  name:'Poly'
};
superObj.prototype.sayHi=function sayHi(){
  console.log('hi');
};
var obj=new superObj();
obj.sayHi();// 'hi'

二、不要使用对象字面量给原型创建属性/方法。

使用对象字面量,就会新创建一个对象,并把新对象的引用地址赋值给构造函数的prototype。例

function superObj(){}
superObj.prototype={
  sayHi:function sayHi(){
    console.log('hi');
  }
}

正确操作如下:

function superObj(){}
superObj.prototype.sayHi=function sayHi(){
  console.log('hi');
}

三、对象实例与原型存在直接对应关系。

意思就是说当一个对__proto__就会保存原型的引用地址,即使构造函数的prototype发生改变,也不会对之前创建的实例中的__proto__产生影响。例

function superObj(){}
superObj.prototype.say=function() {
  console.log('hello');
}
var obj=new superObj();
superObj.prototype={
  say:function() {
    console.log('world');
  }
};
var obj2=new superObj();
obj.say();//'hello'
obj2.say();//'world'

四、最好不要给原型上定义值为引用类型的属性。

如果在原型上定义值为引用类型的属性,那么所有实例都会共享该属性值(引用类型值,指向同一个对象),当其中一个实例修改该引用类型上的值或属性时,所有实例上的都会发生改变。因此值为引用类型的属性,最好在构造函数中定义。例

function superObj(){}
superObj.prototype.ary=[1,2,3];
var obj1=new superObj();
var obj2=new superObj();
obj1.ary[0]=0;//obj1.ary和obj2.ary指向的是同一个数组,当obj1修改此数组时,obj2.ary也会发生改变
console.log(obj2.ary[0]);//0

如果不想让实例共享同一个引用对象,那么就应该在构造函数中进行定义。例

function superObj(){
  this.ary=[1,2,3];
}
var obj1=new superObj();
var obj2=new superObj();
obj1.ary[0]=0;//obj1.ary和obj2.ary指向的不是同一个数组,所以修改obj1.ary不会影响obj2.ary
console.log(obj2.ary[0]);//1

以上这篇详谈js原型继承的一些问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中查找最近的共有祖先元素的实现代码
Dec 30 Javascript
javascript 学习笔记(六)浏览器类型及版本信息检测代码
Apr 08 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
May 04 Javascript
jsonp原理及使用
Oct 28 Javascript
JavaScript中对循环语句的优化技巧深入探讨
Jun 06 Javascript
Angular4学习教程之HTML属性绑定的方法
Jan 04 Javascript
Nuxt.js实战详解
Jan 18 Javascript
Node.js + express基本用法教程
Mar 14 Javascript
vue移动端城市三级联动组件使用详解
Jul 26 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
Jul 20 Javascript
如何利用JavaScript编写一个格斗小游戏
Jan 06 Javascript
JavaScript点击按钮生成4位随机验证码
Jan 28 Javascript
浅谈react.js中实现tab吸顶效果的问题
Sep 06 #Javascript
vue组件初学_弹射小球(实例讲解)
Sep 06 #Javascript
node.js-v6新版安装具体步骤(分享)
Sep 06 #Javascript
Angular2里获取(input file)上传文件的内容的方法
Sep 05 #Javascript
浅谈angular4生命周期钩子
Sep 05 #Javascript
webpack踩坑之路图片的路径与打包
Sep 05 #Javascript
js实现鼠标跟随运动效果
Aug 02 #Javascript
You might like
PHP程序员的技术成长规划
2016/03/25 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
浅析js中2个等号与3个等号的区别
2013/08/06 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
JavaScript表单验证完美代码
2017/03/02 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
Form表单上传文件(type="file")的使用
2017/08/03 Javascript
基于js 本地存储(详解)
2017/08/16 Javascript
使用cookie绕过验证码登录的实现代码
2017/10/12 Javascript
React styled-components设置组件属性的方法
2018/08/07 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
详解NodeJs项目 CentOs linux服务器线上部署
2019/09/16 NodeJs
解决Layui数据表格显示无数据提示的问题
2019/11/14 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
Python学生成绩管理系统简洁版
2020/04/05 Python
Python pandas常用函数详解
2018/02/07 Python
python3操作微信itchat实现发送图片
2018/02/24 Python
Python文件路径名的操作方法
2019/10/30 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
澳洲CFL商城:CHEMIST FOR LESS(中文)
2021/02/28 全球购物
C#可否对内存进行直接的操作
2015/02/26 面试题
MYSQL支持事务吗
2013/08/09 面试题
J2EE相关知识面试题
2013/08/26 面试题
竞选班长演讲稿
2013/12/30 职场文书
吃空饷专项治理工作实施方案
2014/03/04 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
2015年母亲节寄语
2015/03/23 职场文书
办公用品质量保证书
2015/05/11 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang