对象和功能混淆 - 不同的输出

时间:2015-08-23 11:11:42

标签: javascript

我正在学习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

为什么两个输出都不同?

4 个答案:

答案 0 :(得分:6)

因为这个名字是相同的:

bill =  User2;
sarah = User2;

billsarah都指向相同的对象。它们相同彼此。

您可以在JavaScript中查看:

bill == sarah; // true
bill === sarah; // true

在JavaScript中,使用=====比较两个对象意味着comparing their references。因为它们被定义为相同的对象User2,所以它们具有引用相同的对象,因此它们是相同的并且所有更改都是相同的对象

在您的第二个示例中,sarahbill分配相同的对象,在您的第一个示例中sarahbill被分配函数的实例。实例不相同,对象本身就是。

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