我试图了解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中运行以进行测试。
答案 0 :(得分:3)
第三次检查返回true的原因仅仅是stu.prototype
和emp.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));