JS-面向对象之对象引用是什么和它的问题
2018-04-02 14:09
435 查看
function CreatePerson(name, age, job) { this.name = name; this.age = age; this.job = job; this.showName = function() { console.log(this.age +"岁的"+ this.name+ "是一名" + this.job); } } var p1 =new CreatePerson("赟赟", 16, "学生"); var p2 = new CreatePerson("皎皎", 26, "秘书"); console.log(p1.showName == p2.showName ); //false p2.showName(); p1.showName();1、为何下面的结果是false?console.log(p1.showName == p2.showName ); 分析:这个关涉到JS中的对象的引用:var a = [1, 2, 3];
var b = [1, 2, 3];
console.log(a == b);//false为了帮助理解,我们来看看基本类型:var a = 5;
var b = a;
b += 3;
console.log(b); //8
console.log(a); //5基本类型:var b = a; //赋值的时候只是值的复制
接下来看看对象类型是什么样的: var a = [1, 2, 3];
var b = a;
b.push(4);
console.log(b);//[1, 2, 3, 4]
console.log(a);//[1, 2, 3, 4]对象类型:var b = a; // 赋值不仅仅是值的复制,而且也是引用的传递(在内存上,相当于是把a居住的地方也给了b,a和b居住一起)
但是要注意:var a = [1, 2, 3];
var b = a;
b = [1, 2, 3, 4];
console.log(b);//[1, 2, 3, 4]
console.log(a);//[1, 2, 3, ]当程序运行到 b = [1, 2, 3, 4];这句赋值语句的时候,在内存的另为一个位置上重新生成了一个b的值,这个时候a和b已经分手没有关系了,b从a的家里搬离了出来了,既然a和b没有关系了,那么修改b的值,a自然不受到影响!
那么对于比较,基本类型的比较是主要值相同则为true,但是引用类型的比较是要值和引用都要相同才能为true;var a = [1, 2, 3];
var b = [1, 2, 3];
console.log(a == b); //falsea和b虽然值是相同,但是引用不同,依然为false;只有下面这样,把值和引用一样,才能为真,var a = [1, 2, 3];
var b = a;
console.log(a == b);//true那么再回头看:function CreatePerson(name, age, job) { this.name = name; this.age = age; this.job = job; this.showName = function() { console.log(this.age +"岁的"+ this.name+ "是一名" + this.job); } } var p1 =new CreatePerson("赟赟", 16, "学生"); var p2 = new CreatePerson("皎皎", 26, "秘书"); console.log(p1.showName == p2.showName ); //false p2.showName(); p1.showName();上面代码,创建了两个对象,这里对象的地址是不同的,所以结果为false!
上面代码的false与true对于我们写程序有什么影响呢?如果我们创建几百几万个对象,那么在程序中的showName方法在程序中是不是存在几百份同样的方法?这样会极大消耗内存,就会造成内存的浪费?
如果console.log(p1.showName == p2.showName );为true的话,就是在内存中,值和引用都相同,在程序中只存在一份,那么怎么样可以让这个为true呢?怎么样让同样的一个方法在程序只存在一份呢?这就关涉原型,下一节学习原型!
相关文章推荐
- 解决JS内存泄露之js对象和dom对象互相引用问题
- 【转】javascript中值传递,地址传递,引用传递的问题(使用js创建list对象时会用到)
- javascript中值传递,地址传递,引用传递的问题(使用js创建list对象时会用到)
- JS 内存堆栈原理(注销引用对象后带来的问题)
- 何时应将引用形参定义为 const 对象?如果在需要 const 引用时,将形参定 义为普通引用,则会出现什么问题?
- 关于解决JavaScript中使用require引用外部js时出现的某个对象 not defined 时现时消失 问题
- js对象引用和zhizhen问题
- 利用Jquery中的clone对象解决JS中引用传值的问题
- JS 传递对象问题,指针引用
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
- JS面向对象之什么是包装对象(笔记)
- 解决collection调用removeAll()移除不了不同引用同值对象的问题
- 未将对象引用设置到对象的实例--可能出现的问题总结
- ASP.NET中引用JS不能调用JQuery问题 解决
- 什么是JavaScript中的面向对象? 与其他编程语言的面向对象有什么区别? 什么是原型?
- 如何解决引用对象时,必须加所有者(owner)的问题
- 如何解决引用对象时,必须加所有者(owner)的问题
- c++对象成员函数返回自身引用时出现的诡异问题及解决办法
- js面向对象初步探究(上) js面向对象的5种写方法
- 浏览器兼容性问题,是什么?是同一段js、cs代码,不同浏览器有不同效果,甚至bug