Javascript 功能原型

Javascript 功能原型,javascript,Javascript,我有一个叫做可观测的函数。根据所有函数,我可以调用函数上的某些方法,即使它们不直接存在于函数上,JS也会“沿着原型链向下移动”,并获取函数上的方法。此类方法的示例为“toString” 现在,当我将Observable.prototype设置为一个新对象,并在该对象中定义一些方法,然后在Observable上调用这些方法时,它会抛出一个错误 Observable.prototype = { forEachy: function (onNext) { return onNext();

我有一个叫做可观测的函数。根据所有函数,我可以调用函数上的某些方法,即使它们不直接存在于函数上,JS也会“沿着原型链向下移动”,并获取函数上的方法。此类方法的示例为“toString”

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

Observable.prototype = {
  forEachy: function (onNext) {
    return onNext();
  }
}
    console.log(Observable.forEachy(()=>"Hi, John")) // error: Observable.forEachy is not a function
但是我可以在原型上调用这些方法,而且效果很好

console.log(Observable.prototype.forEachy(()=>"Hi, John")); // "Hi, John"
将新实例设置为Observable很好

const abc = new Observable("HI");

console.log(abc.forEachy(()=>"Hello world")); // "Hello world"
拜托,为什么

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


您的示例按预期工作。您应该考虑在JavaScript中获取更多关于原型的信息。 当您将某物声明为Function.prototype=Function{}时,它的工作原理与OOP编程中的方法类似。在oop中不能调用Class.method,是吗?您必须首先创建一个实例来调用此方法。但是,请记住,OOP和原型继承之间有很多区别。实际上,您的原型并不是抽象的。它是现有的对象:

不过,如果您想按照这种方式操作,可以创建类并定义静态方法:

然后:

Observable.forEachy()

可观察。原型=对象。原型;Observable.prototype.forEachy=func=>func;console.logObservable.forEach=>Hi,Jane 1 forEachy与foreach2不同。forEachy不是Observable的直接成员。它是Observable原型的一员。3无论谁从Observable实例化,都会从它的原型中得到所有继承物。@Adelin不,这绝对不是正确的用法。如果这样做,您将向所有对象添加新的原型方法。@AlfMoh原型确定在使用new MyType创建的类型实例上可用的方法/属性。更改原型不会向MyType添加新属性。@JLRishe谢谢-我引用了错误的来源:
const abc = new Observable("HI");
console.log(abc._forEachy) // "HI"
class Observable {
  static forEachy(){
    // your code here
  }
}
Observable.forEachy()