如何正确使用Object.setPrototypeOf()

时间:2017-07-11 19:11:26

标签: javascript ecmascript-6

因此,我一直在快速掌握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.

2 个答案:

答案 0 :(得分:2)

调用Object.setPrototypeOf的原因是为了确保Dog构造函数创建的任何对象都将在其原型链中获得Animal对象。设置构造函数本身的原型是错误的(不要与构造函数prototype属性混淆,这实际上是用词不当),因为构造函数在d&没有位置#39;原型链。

创建的Dog对象在其原型链中未获得Dog,但Dog.prototypeDog 只是创建对象的工具,它不应该成为原型链的一部分。

可以Dog构造函数中执行此操作:

Object.setPrototypeOf(this, Animal)

这使得原型链的长度缩短了一步,但缺点是现在d instanceof Dog将不再成立。它只是Animal。这很糟糕,它解释了为什么保留原始Dog.prototype对象,同时将原型设置为Animal,以便现在dDogAnimal

了解此主题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 原型