详谈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 相关文章推荐
关于使用runtimeStyle属性问题讨论文章
Mar 08 Javascript
javascript中的delete使用详解
Apr 11 Javascript
解决jquery中美元符号命名冲突问题
Jan 08 Javascript
jquery 鼠标滑动显示详情应用示例
Jan 24 Javascript
初识Node.js
Mar 20 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
Dec 28 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
May 28 Javascript
jQuery基础_入门必看知识点
Jul 04 Javascript
基于BootStrap环境写jQuery tabs插件
Jul 12 Javascript
浅谈node中的cluster集群
Jun 02 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
Jun 26 Javascript
vue两组件间值传递 $router.push实现方法
May 15 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 采集程序中常用的函数
2009/12/09 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
JavaScript 验证浏览器是否支持javascript的方法小结
2009/05/17 Javascript
javascript写的日历类(基于pj)
2010/12/28 Javascript
JavaScript中清空数组的三种方法分享
2011/04/07 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
jQuery中常用的遍历函数用法实例总结
2015/09/01 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
vue.js中created方法作用
2018/03/30 Javascript
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
vue通过video.js解决m3u8视频播放格式的方法
2019/07/30 Javascript
python实现bucket排序算法实例分析
2015/05/04 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
如何获取Python简单for循环索引
2019/11/21 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
联想台湾官网:Lenovo TW
2018/05/09 全球购物
Android interview questions
2016/12/25 面试题
学习雷锋演讲稿
2014/05/10 职场文书
给校长的建议书200字
2014/05/16 职场文书
英语分层教学实施方案
2014/06/15 职场文书
研究生求职自荐书
2014/06/23 职场文书
助残日活动总结
2014/08/27 职场文书
政府个人对照检查材料
2014/08/28 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
恰同学少年观后感
2015/06/08 职场文书
2019消防宣传标语!
2019/07/10 职场文书
解决mysql的int型主键自增问题
2021/07/15 MySQL
德劲DE1102数字调谐收音机机评
2022/04/07 无线电
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电