Javascript 在JS中定义继承链-为什么要重新创建原型?
在通读时,我看到我们应该用一个新的原型替换Javascript 在JS中定义继承链-为什么要重新创建原型?,javascript,oop,Javascript,Oop,在通读时,我看到我们应该用一个新的原型替换老师的原型,原型设置为人: Teacher.prototype=Object.create(Person.prototype); Object.defineProperty(Teacher.prototype,'constructor',{ 价值观:老师, enumerable:false,//因此它不会出现在“for-in”循环中 可写:true}); 我宁愿这样做,这对我来说更合乎逻辑: Teacher.prototype.\uuuu proto\
老师的原型,原型设置为人
:
Teacher.prototype=Object.create(Person.prototype);
Object.defineProperty(Teacher.prototype,'constructor',{
价值观:老师,
enumerable:false,//因此它不会出现在“for-in”循环中
可写:true});
我宁愿这样做,这对我来说更合乎逻辑:
Teacher.prototype.\uuuu proto\uuuu=Person.prototype
据我所知,它最终得到相同的结果,并且构造函数保持正确,我不必替换它
MDN的方法和我的有什么不同吗
//编辑
正如@Asutosh所指出的,MDN不鼓励使用\uuuu proto\uuu
()。然而,MDN也表示要使用Object.setPrototypeOf
。那么,我可以这样做吗:
Object.setPrototypeOf(教师、个人、原型)
而不是原来的
Teacher.prototype=Object.create(Person.prototype);
Object.defineProperty(Teacher.prototype,'constructor',{
价值观:老师,
enumerable:false,//因此它不会出现在“for-in”循环中
可写:true});
请记住,在JavaScript中,原型不是未来对象(如类)的概念,而是具有状态和行为的实际实例。创建新实例与其说是继承,不如说是特定实例的特定状态
如果不为原型创建新实例,则新对象可能会与其他意外对象实例共享特定的原型实例。对特定实例状态的更改也会立即影响对象
通过将原型设置为对象的新实例,您可以访问正确的继承链,但是可以使用一个新的、干净的实例,该实例不会与任何其他实现共享
更多信息,请参阅
我可以只做Object.setPrototypeOf(Teacher,Person.prototype)
不,必须是这样
Object.setPrototypeOf(Teacher.prototype, Person.prototype);
你能用这个吗?是的,它非常好,基本上相当于对象。create
+.constructor
定义
那么,为什么这不是标准方法呢?主要是因为自ES5起,Object.create
就可用,而Object.setPrototypeOf
仅在ES6中引入,但在ES6中,我们只会使用class-Teacher-extensed-Person
。在某种程度上不赞成使用proto@华硕:那很有趣,谢谢。那么,这个呢:Object.setPrototypeOf(Teacher,Person.prototype)
这也是不鼓励的。啊,还是:)好的,我明白了。然而,我仍然很好奇,我提出的设置原型的方法是否会破坏某些东西(让我们完全忘记MDN不鼓励这样做)。我试图理解JS是如何工作的。不,它不会破坏任何东西。@Loreno您可能也对它感兴趣,它的工作方式与Object.create