Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在JS中定义继承链-为什么要重新创建原型?_Javascript_Oop - Fatal编程技术网

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