详谈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 相关文章推荐
IE6/7/8中Option元素未设value时Select将获取空字符串
Apr 07 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
Jun 06 Javascript
将list转换为json失败的原因
Dec 17 Javascript
node.js中的fs.existsSync方法使用说明
Dec 17 Javascript
JavaScript数据类型判定的总结笔记
Jul 31 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
Jan 26 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
Feb 21 Javascript
写给小白看的JavaScript异步
Nov 29 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
Apr 20 Javascript
vue实现路由监听和参数监听
Oct 29 Javascript
小程序跳转H5页面的方法步骤
Mar 06 Javascript
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
浅谈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 源代码压缩小工具
2009/12/22 PHP
php防止SQL注入详解及防范
2013/11/12 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
jquery ajax执行后台方法
2010/03/18 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
javascript的函数作用域
2014/11/12 Javascript
JavaScript中的null和undefined区别介绍
2015/01/01 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
jquery实现全选、反选、获得所有选中的checkbox
2020/09/13 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
Vue封装全局过滤器Filters的步骤
2020/09/16 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
Python pymongo模块用法示例
2018/03/31 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
python实现C4.5决策树算法
2018/08/29 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
Pytorch 实现权重初始化
2019/12/31 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
浅谈HTML5 FileReader分布读取文件以及其方法简介
2017/11/09 HTML / CSS
美国轮胎网站:Priority Tire
2018/11/28 全球购物
中专毕业自我鉴定
2013/10/16 职场文书
会议接待欢迎词
2014/01/12 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
Golang ort 中的sortInts 方法
2022/04/24 Golang