您的位置:首页 > Web前端 > JavaScript

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呢?怎么样让同样的一个方法在程序只存在一份呢?这就关涉原型,下一节学习原型!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐