因此,我一直在快速掌握JavaScript的一些新功能,并且已经阅读了有关Object.setPrototypeOf()的内容。我从MDN遇到了一些代码来处理从常规对象继承的代码。但我对他们如何在这里使用Object.setPrototypeOf()感到困惑。我希望他们写一下
Object.setPrototypeOf(Dog, Animal)
与下面的做法相反。他们为什么这样写呢?
var Animal = {
speak() {
console.log(this.name + ' makes a noise.');
}
};
class Dog {
constructor(name) {
this.name = name;
}
}
Object.setPrototypeOf(Dog.prototype, Animal);// If you do not do this you will get a TypeError when you invoke speak
var d = new Dog('Mitzie');
d.speak(); // Mitzie makes a noise.
答案 0 :(得分:2)
调用Object.setPrototypeOf
的原因是为了确保Dog
构造函数创建的任何对象都将在其原型链中获得Animal
对象。设置构造函数本身的原型是错误的(不要与构造函数prototype
属性混淆,这实际上是用词不当),因为构造函数在d
&没有位置#39;原型链。
创建的Dog
对象在其原型链中未获得Dog
,但Dog.prototype
。 Dog
只是创建对象的工具,它不应该成为原型链的一部分。
你可以在Dog
构造函数中执行此操作:
Object.setPrototypeOf(this, Animal)
这使得原型链的长度缩短了一步,但缺点是现在d instanceof Dog
将不再成立。它只是Animal
。这很糟糕,它解释了为什么保留原始Dog.prototype
对象,同时将其原型设置为Animal
,以便现在d
是Dog
和Animal
。
了解此主题here。我会将my own answer提升为Q& A。
答案 1 :(得分:1)
1)动物是对象文字
2)对象文字没有原型属性
3)语法为
Route:post('inloggen', 'Auth\LoginController@login')
Route::get('inloggen', 'Auth\LoginController@showLoginForm')->name('login');
// And other auth routes
4)通过此操作,我们继承
的属性
对象文字(动物)转换为另一个文字或构造函数( Dog )
5)此处,狗的原型是根据动物设置的。
此方法( Object.setPrototypOf())将对 Animal 方法的引用设置为 Dog 的原型