详谈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 相关文章推荐
js获取div高度的代码
Aug 09 Javascript
一些不错的js函数ajax
Aug 20 Javascript
第一个JavaScript入门基础 document.write输出
Feb 22 Javascript
Jquery ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
Mar 27 Javascript
JS来动态的修改url实现对url的增删查改
Sep 05 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
Dec 31 Javascript
JavaScript中toString()方法的使用详解
Jun 05 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
Jan 27 Javascript
浅谈addEventListener和attachEvent的区别
Jul 14 Javascript
使用Vue实现图片上传的三种方式
Jul 17 Javascript
animate.css在vue项目中的使用教程
Aug 05 Javascript
JQuery实现折叠式菜单的详细代码
Jun 03 jQuery
浅谈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程序效率优化的一些策略小结
2010/07/17 PHP
PHP中preg_match函数正则匹配的字符串长度问题
2015/05/27 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
PHP发送短信代码分享
2015/08/11 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
Yii2选项卡的简单使用
2017/05/26 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
jQuery实现强制cookie过期方法汇总
2015/05/22 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
js如何验证密码强度
2020/03/18 Javascript
基于Vant UI框架实现时间段选择器
2020/12/24 Javascript
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
英国50岁以上人群的交友网站:Ourtime
2018/03/28 全球购物
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
室内设计专业个人的自我评价
2013/12/18 职场文书
慰问敬老院活动总结
2014/04/26 职场文书
护理专业自荐信范文
2015/03/06 职场文书
拉贝日记观后感
2015/06/05 职场文书
红色革命电影观后感
2015/06/18 职场文书
中学政教处工作总结
2015/08/13 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
《搭石》教学反思
2016/02/18 职场文书