首页 > 使用类和使用原型创建对象的问题

使用类和使用原型创建对象的问题

  1. 描述你的问题

当使用类创建对象时,对象里面的方法不相等

function Student (name,age,sex) {
    this.name = name;
    this.age  = age;
    this.sex  = sex;
    this.say = function () {
        alert("say:hello");
    }
}
var a = new Student("father","22","female");
var b = new Student("mather","23","male");
console.log(a.say == b.say);//false

而用原型创建两个对象时,对象的方法又相等。

function Teacher () {
}
Teacher.prototype.name = "mother";
Teacher.prototype.age = "30";
Teacher.prototype.sex = "female";
Teacher.prototype.say = function () {
    alert(this.name + "say hello");
}
var t1 = new Teacher();
var t2 = new Teacher();
alert(t1.say == t2.say);//true

这是为什么?能从内存的角度讲一下吗?
其实原型那里我懂..就是第一个不太清楚


在访问一个对象的属性时,如果它本身不存在则顺着原型链向上查找。

第一种方式中 .say 是实例的一个属性,在实例化时添加上的,两个实例对象是不同的存储位置,所以不等;而第二种方式中不是,两个实例的 .say 都是出自同一个对象的,所以相等。


 this.say = function () {
        alert("say:hello");
    }

相当于每次实例化对象的时候,都会定义一个这样的匿名函数。
因为是重新定义的,自然就不会相等


当我们new一个对象的时候,系统会给你创建一个新的对象,然后构造函数是你new的那个函数,也就是你写的 student和teacher,这时构造函数的执行上下文是新创建的对象也就是说,构造函数里的this就是你新创建得对象,在构造函数里执行了this.xx = xx ,所以你new出来的对象会有在构造函数函数体里赋的值,你new了两次,就分别声明了两次function给你new出来的对象,所以第一个例子里他俩不一样,因为那哥俩是两次声明的,虽然长的一样

第二个为啥一样呢,因为原型链,简单的说原型链是啥,就是个对象,每个函数的prototype属性都指向一个对象,这个对象上有方法也有属性,当我们new出来的对象要执行某个方法时,会先看自己有没有这个方法如果没有会沿着原型链一直找,找到就执行他,找不到就再找,最后找不到就出错了,所以第二个相等是因为他们都是原型链上的方法,而这个方法是一个对象上的一个方法,所以相等

大概就是这样吧

说的不太严谨,建议自行查一下原型链是怎么回事…


引自MDN:
如果你执行 var a1 = new A(); var a2 = new A(); 那么 a1.doSomething 事实上会指向Object.getPrototypeOf(a1).doSomething,它就是你在 A.prototype.doSomething 中定义的内容。比如:Object.getPrototypeOf(a1).doSomething == Object.getPrototypeOf(a2).doSomething == A.prototype.doSomething。


1、首先js对象使用 ==与=== 运算符,是引用的比较而不是值的比较。对象和其本身是相等的,和其他对象都不相等。
2、第一种情况下,a.say 与 b.say 是不同的对象(函数也是对象),寄存在于不同的内存。
3、第二种情况下,你会发现 t1.say == t2.say, t2.say == Teacher.prototype.say,也就是说t1.say == t2.say == Teacher.prototype.say 。也说明这三者是一个对象,从内存上说也是一块地方。

楼主可以g一下 js 相等于运算符 和 原型链 之类的

【热门文章】
【热门文章】