Javascript原型比较未给出预期结果

时间:2018-09-06 15:35:55

标签: javascript prototype-chain

我试图了解This Link中的javascript原型继承

然后开始尝试以下有关继承原型分配的实验,

function Person() {}
Person.prototype.dance = function() {};

function Employee() {}

function Student() {}

Employee.prototype = new Person();
Student.prototype = new Person();

emp = new Employee();
stu = new Student();

console.log("Person Object Equal : " + (new Person() == new Person()));
console.log("Emp and Stu Prototype Equal : " + (Employee.prototype == Student.prototype));
console.log("Emp and Stu Object Prototype Equal : " + (emp.prototype == stu.prototype));
console.log("Emp and Stu Object Equal : " + (emp == stu));

如果Class变量Employee.prototype==Student.prototype返回false, 那么对象变量emp.prototype==stu.prototype如何返回true?

我当时以为emp.prototype==stu.prototype也会返回false,因为它们将指向与其类函数相同的原型。

有人可以解释一下背后的确切逻辑是什么吗? 也许我在这里有些遗漏..?

您可以复制以上代码并在上面提供的Same Link中运行以进行测试。

2 个答案:

答案 0 :(得分:3)

第三次检查返回true的原因仅仅是stu.prototypeemp.prototype都未定义。 .prototype是构造函数上存在的属性;通过new对该构造函数创建的对象上不存在它。

emp确实具有emp.__proto__属性,但已弃用该属性,您不应直接访问它。 emp.__proto__ === Employee.prototype将返回true。尽管即使您很少有理由使用它,但访问原型的非弃用方法仍是Object.getPrototypeOf(emp)

答案 1 :(得分:-4)

我了解我,你真正想要的是:

function Person() {}
Person.prototype.dance = function() {};

function Employee() {}

function Student() {}

// Employee.prototype = new Person();
// Student.prototype = new Person();

const person = new Person();
Employee.prototype = person;
Student.prototype = person;


const emp = new Employee();
const stu = new Student();

console.log("Person Object Equal : " + (new Person() === new Person()));
console.log("Emp and Stu Prototype Equal : " + (Employee.prototype === Student.prototype));
console.log("Emp and Stu Object Prototype Equal : " + (emp.prototype === stu.prototype));
console.log("Emp and Stu Object Equal : " + (emp === stu));