这种继承如何运作?

时间:2016-06-01 06:52:50

标签: javascript inheritance ecmascript-6

const proto = {
  hello () {
    return `Hello, my name is ${ this.name }`;
  }
};
const greeter = (name) => Object.assign(Object.create(proto), { name });
const george = greeter('george');
const msg = george.hello();
console.log(msg);  

当我遇到上述类型的继承时,我正在阅读JavaScript Scene。我是JS的新手。

所以,proto是我们将从中创建原型的对象。

Que 1:如果proto是一个对象,它如何在自己内部有一个函数而不将它与一个键相关联?不应该是{ "hello" : function(){...} }

与此相关,
Que 2:胖箭头函数可以作为键值对存储在对象中吗?

Que 3. Object.assign如何运作?
在阅读MDN之后,我理解的是,从第二个参数开始的所有内容都被复制到target中,在我们的例子中它是原型。正确的吗?

1 个答案:

答案 0 :(得分:1)

  

Que 1:如果proto是一个对象,它如何在自己内部有一个函数而不将它与一个键相关联?不应该是{“你好”:function(){...}}

这是因为在对象上定义方法的enu ES6语法。有关语法的详细信息,请参阅此处:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions

  

Que 2:胖箭头函数可以作为键值对存储在对象中吗?

是。你可以这样做:

let obj = {
  func: () => {
    console.log(`Hello world!`);
  }
}

obj.func();
  

Que 3. Object.assign如何工作?

来自文档:

  

Object.assign()方法用于将所有可枚举的自有属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

     

Object.assign(target, ...sources)

在你的情况下,它实际上不是原型,而是一个与proto原型相关的对象。因此,您的greeter会返回一个包含namehello()方法来自原型链的对象