我正在学习JavaScript,我正在与function User() { }
和var User2 = { }
function User() {
this.name = '';
this.love = function love(user) {
console.log(this.name + " Love " + user.name);
}
}
bill = new User();
sarah = new User();
bill.name = "Bill";
sarah.name = "Sarah";
输出:
bill.love(sarah); //Bill Love Sarah
当我将函数User()替换为var对象时,例如:
var User2 = {
name: "",
love: function love(user) {
console.log(this.name + " Love " + user.name);
}
}
bill = User2;
sarah = User2;
bill.name = "Bill";
sarah.name = "Sarah";
输出:
bill.love(sarah); //Sarah Love Sarah
为什么两个输出都不同?
答案 0 :(得分:6)
因为这个名字是相同的:
bill = User2;
sarah = User2;
bill
和sarah
都指向相同的对象。它们相同彼此。
您可以在JavaScript中查看:
bill == sarah; // true
bill === sarah; // true
在JavaScript中,使用==
或===
比较两个对象意味着comparing their references。因为它们被定义为相同的对象User2
,所以它们具有引用到相同的对象,因此它们是相同的并且所有更改都是相同的对象
在您的第二个示例中,sarah
和bill
被分配相同的对象,在您的第一个示例中sarah
和bill
被分配函数的实例。实例不相同,对象本身就是。
bill.name = "Bill";
与
相同sarah.name = "Bill";
和
sarah.name = "Sarah";
与
相同bill.name = "Sarah";
使用函数构造函数的解决方案是正确的方法。
答案 1 :(得分:3)
您正在使用引用,而不是继承。要继承,请使用Object create方法:
bill = Object.create(User2);
sarah = Object.create(User2);
Object.create()方法使用指定的原型对象和属性创建一个新对象。
答案 2 :(得分:3)
在第一个示例中,您正在创建2个不同的User实例(感谢new
关键字)。因此,每个人都有不同的名称值。
在第二个示例中,您将文本对象(var literalObj = {}
表示法)的实例存储在User2变量中。因此,在执行bill = User2
时,您将对实例User2的引用存储在bill变量中。然后,将User2实例引用存储到sarah变量。此时,User2,bill和sarah对具有name属性和love方法的对象具有相同的引用。
最后,您将该实例的名称设置为“Bill”,然后设置为“Sarah”,因此“Bill”将替换为“Sarah”,因为您正在更新相同的实例。最后,bill === sarah
所以bill.name === sarah.name是“莎拉”。
答案 3 :(得分:1)
User是一个函数,User2是一个变量。
在此代码中:
function User() {
this.name = '';
this.love = function love(user) {
console.log(this.name + " Love " + user.name);
}
}
bill = new User();
sarah = new User();
bill.name = "Bill";
sarah.name = "Sarah";
bill 和 sarah 是用户的两个不同对象,具有不同的值。
但是在这段代码中:
var User2 = {
name: "",
love: function love(user) {
console.log(this.name + " Love " + user.name);
}
}
bill = User2;
sarah = User2;
bill.name = "Bill";
sarah.name = "Sarah";
bill 和 sarah 都指的是相同的变量。
最初 User2.name是""
从这一行:
bill.name = "Bill";
User2.name已更新为" Bill"
并使用此行
sarah.name = "Sarah";
User2.name已更新为" Sarah"
这就是为什么第二个输出是:
Sarah Love Sarah