我有一个名为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"
答案 0 :(得分:1)
您的示例按预期工作。您应该考虑在JavaScript中获取有关Prototypes的更多信息。
当您将某些内容声明为Function.prototype = function(){}
时,它的工作方式与OOP编程中的方法类似。在oop你不能调用Class.method(),可以吗?您必须首先创建一个实例来调用此方法。但是,请记住,OOP和原型继承之间存在很多差异。实际上,你的“原型”不是抽象。这是现有的对象:)
但是,如果您想这样做,可以创建class
并定义static method
:
class Observable {
static forEachy(){
// your code here
}
}
然后:
Observable.forEachy()