详谈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 相关文章推荐
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
Feb 15 Javascript
新浪微博字数统计 textarea字数统计实现代码
Aug 28 Javascript
Jquery Validate 正则表达式实用验证代码大全
Aug 23 Javascript
jquery遍历checkbox的注意事项说明
Feb 21 Javascript
详解JavaScript中setSeconds()方法的使用
Jun 11 Javascript
jquery实现先淡出再折叠收起的动画效果
Aug 07 Javascript
jQuery将表单序列化成一个Object对象的实例
Nov 29 Javascript
jQuery向webApi提交post json数据
Jan 16 Javascript
Angular.js之作用域scope'@','=','&'实例详解
Feb 28 Javascript
Angular angular-file-upload文件上传的示例代码
Aug 23 Javascript
微信小程序实现定位及到指定位置导航的示例代码
Aug 20 Javascript
vue自定义指令和动态路由实现权限控制
Aug 28 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/10/23 PHP
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
Js 中debug方式
2010/02/07 Javascript
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
2010/04/25 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
Python实现直播推流效果
2019/11/26 Python
python列表推导式入门学习解析
2019/12/02 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
简单说下OSPF的操作过程
2014/08/13 面试题
护理学毕业生求职信
2013/11/14 职场文书
车间工艺员岗位职责
2013/12/09 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
植树节新闻稿
2015/07/17 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书
如何自己动手写SQL执行引擎
2021/06/02 MySQL
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL