详谈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版TAB选项卡效果实例
Aug 16 Javascript
js中继承的几种用法总结(apply,call,prototype)
Dec 26 Javascript
JavaScript判断IE版本型号
Jul 27 Javascript
javascript cookie基础应用之记录用户名的方法
Sep 20 Javascript
AngularJS实现在ng-Options加上index的解决方法
Nov 03 Javascript
以BootStrap Tab为例写一个前端组件
Jul 25 Javascript
详解使用VueJS开发项目中的兼容问题
Aug 02 Javascript
express启用https使用小记
May 21 Javascript
Javascript模拟实现new原理解析
Mar 03 Javascript
Vue+Vuex实现自动登录的知识点详解
Mar 04 Javascript
jQuery实现简单日历效果
Jul 05 jQuery
JavaScript获取URL参数的方法分享
Apr 07 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
yii上传文件或图片实例
2014/04/01 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
PHP实现上传文件并存进数据库的方法
2015/07/16 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
2017/05/26 PHP
PDO::commit讲解
2019/01/27 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
2009/05/25 Javascript
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
node.js中的http.createClient方法使用说明
2014/12/15 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
Python3.7 dataclass使用指南小结
2019/02/22 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
PyQt5 对图片进行缩放的实例
2019/06/18 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
OpenCV读取与写入图片的实现
2020/10/13 Python
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
匡威西班牙官网:Converse西班牙
2019/10/01 全球购物
财务会计毕业生自荐信
2013/11/02 职场文书
大学生期末自我鉴定
2014/02/01 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
开天辟地观后感
2015/06/09 职场文书
安全教育观后感
2015/06/17 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
nginx反向代理时如何保持长连接
2021/03/31 Servers