javascript - 函数原型(prototype)

标签 javascript

我有一个名为Observable的函数。对于所有函数,我可以调用函数上的某些方法,即使它们不直接存在于函数上,JS 也会“沿着原型(prototype)链”移动并获取函数上的方法。此类方法的示例是“toString()

function Observable(forEachy) {
  this._forEachy = forEachy;
}
console.log(Observable.toString()) // "function Observable(forEach) {this._forEach = forEach;}"

现在,当我将 Observable.prototype 设置为一个新对象并在该对象中定义一些方法,并在 Observable 上调用这些方法时,它会引发错误。

Observable.prototype = {
  forEachy: function (onNext) {
    return onNext();
  }
}
    console.log(Observable.forEachy(()=>"Hi, John")) // error: Observable.forEachy is not a function

但我可以在原型(prototype)上调用这些方法,而且效果很好。

console.log(Observable.prototype.forEachy(()=>"Hi, John")); // "Hi, John"

将一个新实例设置为 Observable 就可以正常工作。

const abc = new Observable("HI");

console.log(abc.forEachy(()=>"Hello world")); // "Hello world"

请问这是为什么?

此外,除了将构造函数中收到的参数传递给新创建的对象之外,语句 this._forEachy = forEachy 还做了什么?

const abc = new Observable("HI");
console.log(abc._forEachy) // "HI"

最佳答案

您的示例按预期工作。您应该考虑获取有关 JavaScript 中的原型(prototype)的更多信息。

当您将某些内容声明为 Function.prototype = function(){} 时,它的工作方式类似于 OOP 编程中的方法。在oop中你不能调用Class.method(),可以吗?您必须首先创建一个实例才能调用此方法。但是,请记住,OOP 和原型(prototype)继承之间存在很多差异。事实上,你的“原型(prototype)”并不是抽象的。这是现有的对象:)

但是,如果您想遵循这种方式,您可以创建并定义静态方法:

class Observable {
  static forEachy(){
    // your code here
  }
}

然后:

Observable.forEachy()

关于javascript - 函数原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50871079/

相关文章:

javascript - 在 Rally SDK 2 中,某些记录类型是否不可用于 WSAPIDataStore?

javascript - 如何在 $.ajax 的回调函数内更改组件 View 中的变量

javascript - 如何在 Javascript 中强制同步循环执行?

javascript - <head> 中应包含哪些 JavaScript,<body> 中应包含哪些内容?

javascript - Javascript 评估是否在 LESS(精简 CSS)中工作?

javascript - Electron - 文本区域对更改事件没有反应

javascript - 如何编写一个 for 循环来并行发出 X 个 api 请求?

javascript - 从异步调用访问成员方法

javascript - 使用 jquery 检查复选框中具有特定值的所有内容

javascript - Litelement 将对象作为 html 属性传递