详谈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 相关文章推荐
地震发生中逃生十大法则
May 12 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
Dec 10 Javascript
标题过长使用javascript按字节截取字符串
Apr 24 Javascript
JavaScript删除指定子元素代码实例
Jan 13 Javascript
javascript匀速运动实现方法分析
Jan 08 Javascript
全面解析Bootstrap布局组件应用
Feb 22 Javascript
BootStrap实现手机端轮播图左右滑动事件
Oct 13 Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
Jan 06 Javascript
Vue.js数据绑定之data属性
Jul 07 Javascript
微信小程序网络请求封装示例
Jul 24 Javascript
Koa 中的错误处理解析
Apr 09 Javascript
Vue中watch、computed、updated三者的区别及用法
Jul 27 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下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
PHP中其实也可以用方法链
2011/11/10 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
php中将一个对象保存到Session中的方法
2015/03/13 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
JavaScript 语言基础知识点总结(思维导图)
2013/11/10 Javascript
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
JavaScript页面模板库handlebars的简单用法
2015/03/02 Javascript
基于JavaScript实现动态添加删除表格的行
2016/02/01 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
Python实现的简单dns查询功能示例
2017/05/24 Python
浅谈Python peewee 使用经验
2017/10/20 Python
python3转换code128条形码的方法
2019/04/17 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
python通过链接抓取网站详解
2019/11/20 Python
python add_argument()用法解析
2020/01/29 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
捐书寄语赠言
2014/01/18 职场文书
一份恶作剧的检讨书
2014/09/13 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
法律进社区活动总结
2015/05/07 职场文书
户外拓展训练感想
2015/08/07 职场文书
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python
mysql 排序失效
2022/05/20 MySQL