详谈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 相关文章推荐
Javascript 中文字符串处理额外注意事项
Nov 15 Javascript
js 异步处理进度条
Apr 01 Javascript
niceTitle 基于jquery的超链接提示插件
May 31 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
Jul 18 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
Feb 20 Javascript
Javascript显示和隐藏ul列表的方法
Jul 15 Javascript
javascript字符串函数汇总
Dec 06 Javascript
vue addRoutes实现动态权限路由菜单的示例
May 15 Javascript
Node.js中的cluster模块深入解读
Jun 11 Javascript
简述vue状态管理模式之vuex
Aug 29 Javascript
Vue中key的作用示例代码详解
Jun 10 Javascript
原生js实现弹窗消息动画
Nov 20 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下使用无限生命期Session的方法
2007/03/16 PHP
php实现读取超大文件的方法
2014/07/28 PHP
php中ftp_chdir与ftp_cdup函数用法
2014/11/18 PHP
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
php模板引擎技术简单实现
2016/03/15 PHP
javascript 打印页面代码
2009/03/24 Javascript
JavaScrip单线程引擎工作原理分析
2010/09/04 Javascript
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
浅谈document.write()输出样式
2015/05/07 Javascript
javascript实现dom动态创建省市纵向列表菜单的方法
2015/05/14 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
javascript实现仿百度图片的瀑布流加载效果
2016/04/20 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
python持久性管理pickle模块详细介绍
2015/02/18 Python
Python中tell()方法的使用详解
2015/05/24 Python
Python实现读取json文件到excel表
2017/11/18 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
Python打印不合法的文件名
2020/07/31 Python
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
医学检验专业个人求职信范文
2013/12/04 职场文书
房地产销售员的自我评价分享
2013/12/04 职场文书
三八活动策划方案
2014/08/17 职场文书
幼儿园小班教师个人工作总结
2015/02/06 职场文书
交通事故案件代理词
2015/05/23 职场文书
《植树问题》教学反思
2016/03/03 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers