函数原型

时间:2018-06-15 07:37:27

标签: javascript

我有一个名为Observable的函数。根据所有函数,我可以在函数上调用某些方法,即使它们不直接存在于函数中,JS也会在原型链上移动。并获取该函数的方法。此类方法的示例是' 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

但是我可以在原型上调用这些方法并且它可以正常工作。

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"

1 个答案:

答案 0 :(得分:1)

您的示例按预期工作。您应该考虑在JavaScript中获取有关Prototypes的更多信息。

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

但是,如果您想这样做,可以创建class并定义static method

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

然后:

Observable.forEachy()