【问题标题】:How does this inheritance work?这种继承是如何工作的?
【发布时间】:2016-06-01 06:52:49
【问题描述】:
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 是我们将创建原型的对象。

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

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

问题 3.Object.assign 是如何工作的?
阅读 MDN 后,我了解到从第二个参数开始的所有内容都被复制到 target 中,在我们的例子中是一个原型。对吗?

【问题讨论】:

  • 对于第 1 点和第 2 点.=>这段代码 sn-p 属于 ES2016,而这个版本的 JS,它是有效的 JavaScript。
  • @AshishKumar 我知道这是有效的 JS。我只是想弄清楚它是如何工作的。
  • 你错过了 ES2016... :)
  • Object.assign 是用其他对象扩展一个对象。它将其他对象的属性复制到当前对象。
  • #3:Object.create(proto) 创建一个对象,其 [[Prototype]] 隐藏链接指向 proto,因此 proto 未被修改,而是将 name 添加到此新对象中

标签: javascript inheritance ecmascript-6


【解决方案1】:

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

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

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

是的。你可以这样做:

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

obj.func();

问题 3. Object.assign 是如何工作的?

来自文档:

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

Object.assign(target, ...sources)

在您的情况下,它实际上不是原型,而是原型链接到proto 的对象。所以你的greeter 返回一个具有name 的对象,而hello() 方法来自原型链

【讨论】:

  • 好的,我问Que 1. 的原因是:我知道函数可以存储在变量中。代码sn-p的写法,我很困惑ES6类是否也可以通过跳过class关键字来存储到变量中。看起来可能是这种情况?
  • Que 1 中的语法hello () {} 只是{ "hello" : function(){...} } 的精简版本。参考这个:2ality.com/2014/12/es6-oop.html
  • @LittleChild: 不会。但是你可以使用var foo = class {};等类表达式(类似于函数表达式)。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 2012-12-18
  • 1970-01-01
相关资源
最近更新 更多