详谈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 相关文章推荐
jquery 笔记 事件
Nov 02 Javascript
JavaScript实现快速排序(自已编写)
Dec 19 Javascript
jQuery写fadeTo示例代码
Feb 21 Javascript
js实现局部页面打印预览原理及示例代码
Jul 03 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
May 06 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
Jun 17 Javascript
vue-cli 组件的导入与使用教程详解
Apr 11 Javascript
一篇文章弄懂javascript中的执行栈与执行上下文
Aug 09 Javascript
改变layer confirm弹窗按钮的颜色方法
Sep 12 Javascript
jQuery实现的分页插件完整示例
May 26 jQuery
JavaScript实现网页下拉菜单效果
Nov 20 Javascript
js实现简单商品筛选功能
Feb 02 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
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
最新28个很棒的jQuery 教程
2011/05/28 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
js实现打字小游戏
2019/12/17 Javascript
uniapp,微信小程序中使用 MQTT的问题
2020/07/11 Javascript
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
Python中的自定义函数学习笔记
2014/09/23 Python
python自动格式化json文件的方法
2015/03/11 Python
Python 查看文件的编码格式方法
2017/12/21 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
大专应届生个人简历的自我评价
2013/10/15 职场文书
《老王》教学反思
2014/02/23 职场文书
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
五分钟演讲稿
2014/04/30 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
2017元旦晚会开幕词
2016/03/03 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android